Experiment 2.1: Implement a simple ANN for CIFAR-10 Dataset with the help of TensorFlow and Keras module. Measure the performance and predict some new data¶

Load data set and print a few data.¶

In [ ]:
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import numpy as np
import matplotlib.pyplot as plt

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_images, test_images = train_images / 255.0, test_images / 255.0

class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']

plt.figure(figsize=(10, 5))
for i in range(10):
    plt.subplot(1, 10, i + 1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i])
    plt.xlabel(class_names[train_labels[i][0]])
plt.show()
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170498071/170498071 ━━━━━━━━━━━━━━━━━━━━ 195s 1us/step
No description has been provided for this image

Building a model from scartch just to understand the process of forward and back ward pass and training a mode.¶

In [ ]:
import numpy as np
import matplotlib.pyplot as plt

def relu(x):
    return np.maximum(0, x)

def relu_derivative(x):
    return np.where(x > 0, 1, 0)

def softmax(x):
    exps = np.exp(x - np.max(x, axis=1, keepdims=True))
    return exps / np.sum(exps, axis=1, keepdims=True)

def cross_entropy_loss(y_true, y_pred):
    n_samples = y_true.shape[0]
    logp = - np.log(y_pred[range(n_samples), y_true])
    loss = np.sum(logp) / n_samples
    return loss

def cross_entropy_loss_derivative(y_true, y_pred):
    grad = y_pred.copy()
    grad[range(y_true.shape[0]), y_true] -= 1
    return grad / y_true.shape[0]

input_dim = 32 * 32 * 3
hidden_layer1_dim = 128
hidden_layer2_dim = 64
output_dim = 10

np.random.seed(42)
W1 = np.random.randn(input_dim, hidden_layer1_dim) * np.sqrt(2. / input_dim)
b1 = np.zeros((1, hidden_layer1_dim))
W2 = np.random.randn(hidden_layer1_dim, hidden_layer2_dim) * np.sqrt(2. / hidden_layer1_dim)
b2 = np.zeros((1, hidden_layer2_dim))
W3 = np.random.randn(hidden_layer2_dim, output_dim) * np.sqrt(2. / hidden_layer2_dim)
b3 = np.zeros((1, output_dim))

def forward(X):
    z1 = np.dot(X, W1) + b1
    a1 = relu(z1)
    z2 = np.dot(a1, W2) + b2
    a2 = relu(z2)
    z3 = np.dot(a2, W3) + b3
    a3 = softmax(z3)
    return z1, a1, z2, a2, z3, a3

def backward(X, y, z1, a1, z2, a2, z3, a3, learning_rate=0.01):
    global W1, b1, W2, b2, W3, b3

    dz3 = cross_entropy_loss_derivative(y, a3)
    dW3 = np.dot(a2.T, dz3)
    db3 = np.sum(dz3, axis=0, keepdims=True)

    dz2 = np.dot(dz3, W3.T) * relu_derivative(z2)
    dW2 = np.dot(a1.T, dz2)
    db2 = np.sum(dz2, axis=0, keepdims=True)

    dz1 = np.dot(dz2, W2.T) * relu_derivative(z1)
    dW1 = np.dot(X.T, dz1)
    db1 = np.sum(dz1, axis=0, keepdims=True)
    
    W1 -= learning_rate * dW1
    b1 -= learning_rate * db1
    W2 -= learning_rate * dW2
    b2 -= learning_rate * db2
    W3 -= learning_rate * dW3
    b3 -= learning_rate * db3

def load_cifar10():
    import tensorflow as tf
    (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data()
    train_images = train_images.astype('float32') / 255
    test_images = test_images.astype('float32') / 255
    train_labels = train_labels.flatten()
    test_labels = test_labels.flatten()
    return train_images, train_labels, test_images, test_labels

train_images, train_labels, test_images, test_labels = load_cifar10()
train_images_flatten = train_images.reshape(train_images.shape[0], -1)
test_images_flatten = test_images.reshape(test_images.shape[0], -1)

epochs = 30
learning_rate = 0.01
train_accuracy_list = []
val_accuracy_list = []

validation_split = 0.1
num_val_samples = int(validation_split * train_images_flatten.shape[0])
val_images = train_images_flatten[:num_val_samples]
val_labels = train_labels[:num_val_samples]
partial_train_images = train_images_flatten[num_val_samples:]
partial_train_labels = train_labels[num_val_samples:]

for epoch in range(epochs):
    z1, a1, z2, a2, z3, a3 = forward(partial_train_images)
    loss = cross_entropy_loss(partial_train_labels, a3)
    backward(partial_train_images, partial_train_labels, z1, a1, z2, a2, z3, a3, learning_rate)
    train_predictions = np.argmax(a3, axis=1)
    train_accuracy = np.mean(train_predictions == partial_train_labels)
    train_accuracy_list.append(train_accuracy)
    z1_val, a1_val, z2_val, a2_val, z3_val, a3_val = forward(val_images)
    val_predictions = np.argmax(a3_val, axis=1)
    val_accuracy = np.mean(val_predictions == val_labels)
    val_accuracy_list.append(val_accuracy)
    print(f'Epoch {epoch+1}/{epochs}, Train Accuracy: {train_accuracy}, Val Accuracy: {val_accuracy}')

_, _, _, _, _, a3_test = forward(test_images_flatten)
test_predictions = np.argmax(a3_test, axis=1)
test_accuracy = np.mean(test_predictions == test_labels)
print(f'Test accuracy: {test_accuracy}')
Epoch 1/30, Train Accuracy: 0.1128, Val Accuracy: 0.1186
Epoch 2/30, Train Accuracy: 0.11971111111111112, Val Accuracy: 0.128
Epoch 3/30, Train Accuracy: 0.12793333333333334, Val Accuracy: 0.1348
Epoch 4/30, Train Accuracy: 0.13686666666666666, Val Accuracy: 0.1432
Epoch 5/30, Train Accuracy: 0.14486666666666667, Val Accuracy: 0.148
Epoch 6/30, Train Accuracy: 0.14922222222222223, Val Accuracy: 0.152
Epoch 7/30, Train Accuracy: 0.15288888888888888, Val Accuracy: 0.1554
Epoch 8/30, Train Accuracy: 0.15711111111111112, Val Accuracy: 0.1598
Epoch 9/30, Train Accuracy: 0.15982222222222223, Val Accuracy: 0.1632
Epoch 10/30, Train Accuracy: 0.16286666666666666, Val Accuracy: 0.1682
Epoch 11/30, Train Accuracy: 0.16533333333333333, Val Accuracy: 0.1682
Epoch 12/30, Train Accuracy: 0.16857777777777777, Val Accuracy: 0.1718
Epoch 13/30, Train Accuracy: 0.17155555555555554, Val Accuracy: 0.176
Epoch 14/30, Train Accuracy: 0.1749777777777778, Val Accuracy: 0.1806
Epoch 15/30, Train Accuracy: 0.1784888888888889, Val Accuracy: 0.1858
Epoch 16/30, Train Accuracy: 0.18146666666666667, Val Accuracy: 0.1916
Epoch 17/30, Train Accuracy: 0.18457777777777779, Val Accuracy: 0.1952
Epoch 18/30, Train Accuracy: 0.18777777777777777, Val Accuracy: 0.1978
Epoch 19/30, Train Accuracy: 0.19124444444444444, Val Accuracy: 0.201
Epoch 20/30, Train Accuracy: 0.1942, Val Accuracy: 0.2024
Epoch 21/30, Train Accuracy: 0.19686666666666666, Val Accuracy: 0.205
Epoch 22/30, Train Accuracy: 0.19926666666666668, Val Accuracy: 0.2082
Epoch 23/30, Train Accuracy: 0.2021777777777778, Val Accuracy: 0.2092
Epoch 24/30, Train Accuracy: 0.2049777777777778, Val Accuracy: 0.2154
Epoch 25/30, Train Accuracy: 0.20773333333333333, Val Accuracy: 0.218
Epoch 26/30, Train Accuracy: 0.21006666666666668, Val Accuracy: 0.2188
Epoch 27/30, Train Accuracy: 0.21322222222222223, Val Accuracy: 0.2232
Epoch 28/30, Train Accuracy: 0.21588888888888888, Val Accuracy: 0.226
Epoch 29/30, Train Accuracy: 0.21746666666666667, Val Accuracy: 0.2302
Epoch 30/30, Train Accuracy: 0.21988888888888888, Val Accuracy: 0.2298
Test accuracy: 0.2225
In [ ]:
plt.figure(figsize=(10, 6))
plt.plot(range(1, epochs + 1), train_accuracy_list, label='Training Accuracy')
plt.plot(range(1, epochs + 1), val_accuracy_list, label='Validation Accuracy')
plt.axhline(y=test_accuracy, color='r', linestyle='--', label='Test Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.title('Training, Validation, and Test Accuracy over 30 Epochs for custom built model.')
plt.legend()
plt.tight_layout()
plt.show()
No description has been provided for this image

Using the tensorflow inbuilt fuction to build and evaluate a model.¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
from sklearn.model_selection import train_test_split

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0
train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

model = models.Sequential([
    layers.Flatten(input_shape=(32, 32, 3)),  
    layers.Dense(128, activation='relu'),  
    layers.Dense(64, activation='relu'),  
    layers.Dense(10, activation='softmax')  
])

model.compile(optimizer='sgd', 
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=15,
                    validation_data=(val_images, val_labels))

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'Test accuracy: {test_acc}')
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Epoch 1/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.2537 - loss: 2.0486 - val_accuracy: 0.3581 - val_loss: 1.7957
Epoch 2/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.3715 - loss: 1.7650 - val_accuracy: 0.4094 - val_loss: 1.6703
Epoch 3/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.4118 - loss: 1.6684 - val_accuracy: 0.4185 - val_loss: 1.6475
Epoch 4/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.4349 - loss: 1.5989 - val_accuracy: 0.4365 - val_loss: 1.5981
Epoch 5/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.4447 - loss: 1.5610 - val_accuracy: 0.4373 - val_loss: 1.5883
Epoch 6/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.4551 - loss: 1.5266 - val_accuracy: 0.4486 - val_loss: 1.5620
Epoch 7/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.4715 - loss: 1.4915 - val_accuracy: 0.4648 - val_loss: 1.5235
Epoch 8/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.4860 - loss: 1.4676 - val_accuracy: 0.4592 - val_loss: 1.5261
Epoch 9/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.4890 - loss: 1.4468 - val_accuracy: 0.4553 - val_loss: 1.5153
Epoch 10/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.4963 - loss: 1.4325 - val_accuracy: 0.4700 - val_loss: 1.4903
Epoch 11/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5040 - loss: 1.3991 - val_accuracy: 0.4792 - val_loss: 1.4660
Epoch 12/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5119 - loss: 1.3814 - val_accuracy: 0.4740 - val_loss: 1.4770
Epoch 13/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.5123 - loss: 1.3727 - val_accuracy: 0.4731 - val_loss: 1.4698
Epoch 14/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5230 - loss: 1.3533 - val_accuracy: 0.4785 - val_loss: 1.4688
Epoch 15/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5269 - loss: 1.3336 - val_accuracy: 0.4853 - val_loss: 1.4508
313/313 - 0s - 2ms/step - accuracy: 0.4948 - loss: 1.4231
Test accuracy: 0.49480000138282776

Measuring the accouracy of the model.¶

In [ ]:
plt.figure(figsize=(10, 6))
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.axhline(y=test_acc, color='r', linestyle='--', label=f'Test Accuracy: {test_acc:.4f}')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.title('Training and Validation Accuracy over 15 Epochs of ANN built using tensorflow model')
plt.legend()
plt.grid(True)
plt.show()
No description has been provided for this image
In [ ]:
from tensorflow.keras.preprocessing import image
import matplotlib.pyplot as plt

def load_and_preprocess_image(img_path):
    img = image.load_img(img_path, target_size=(32, 32))
    plt.imshow(image.load_img(img_path)) 
    img_array = image.img_to_array(img)  
    img_array = np.expand_dims(img_array, axis=0)  
    img_array = img_array / 255.0  
    return img_array

def predict_image_class(model, img_path):
    new_image = load_and_preprocess_image(img_path)
    predictions = model.predict(new_image)
    predicted_class = np.argmax(predictions)
    class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
    predicted_class_name = class_names[predicted_class]
    return predicted_class_name

new_image_path = 'frog.jpg'
predicted_class_name = predict_image_class(model, new_image_path)
print(f'The model predicts that the image belongs to class: {predicted_class_name}')
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 71ms/step
The model predicts that the image belongs to class: frog
No description has been provided for this image
In [ ]:
new_image_path = 'aeroplane.jpg'
predicted_class_name = predict_image_class(model, new_image_path)
print(f'The model predicts that the image belongs to class: {predicted_class_name}')
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
The model predicts that the image belongs to class: airplane
No description has been provided for this image
In [ ]:
new_image_path = 'a1.jpg'
predicted_class_name = predict_image_class(model, new_image_path)
print(f'The model predicts that the image belongs to class: {predicted_class_name}')
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
The model predicts that the image belongs to class: airplane
No description has been provided for this image

Experiment 2.2: Implement a simple CNN for same data set and compare the performance of the first model and this model¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
from sklearn.model_selection import train_test_split

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

model.compile(optimizer='sgd',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=15, batch_size=64,
                    validation_data=(val_images, val_labels))

test_loss, test_acc1 = model.evaluate(test_images, test_labels, verbose=2)
print(f'Test accuracy: {test_acc1}')
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\convolutional\base_conv.py:107: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(activity_regularizer=activity_regularizer, **kwargs)
Epoch 1/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 10s 14ms/step - accuracy: 0.1452 - loss: 2.2637 - val_accuracy: 0.2823 - val_loss: 1.9922
Epoch 2/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 9s 13ms/step - accuracy: 0.2880 - loss: 1.9626 - val_accuracy: 0.3453 - val_loss: 1.8435
Epoch 3/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 9s 13ms/step - accuracy: 0.3584 - loss: 1.7802 - val_accuracy: 0.3906 - val_loss: 1.6947
Epoch 4/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 10s 14ms/step - accuracy: 0.4121 - loss: 1.6300 - val_accuracy: 0.4212 - val_loss: 1.6565
Epoch 5/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 8s 12ms/step - accuracy: 0.4482 - loss: 1.5340 - val_accuracy: 0.4583 - val_loss: 1.5104
Epoch 6/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 10s 14ms/step - accuracy: 0.4735 - loss: 1.4611 - val_accuracy: 0.4511 - val_loss: 1.5378
Epoch 7/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 10s 15ms/step - accuracy: 0.4952 - loss: 1.4169 - val_accuracy: 0.4760 - val_loss: 1.4040
Epoch 8/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 9s 13ms/step - accuracy: 0.5141 - loss: 1.3605 - val_accuracy: 0.5093 - val_loss: 1.3478
Epoch 9/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 9s 13ms/step - accuracy: 0.5354 - loss: 1.3150 - val_accuracy: 0.5197 - val_loss: 1.3518
Epoch 10/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 10s 15ms/step - accuracy: 0.5503 - loss: 1.2719 - val_accuracy: 0.5527 - val_loss: 1.2477
Epoch 11/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 10s 14ms/step - accuracy: 0.5643 - loss: 1.2325 - val_accuracy: 0.5230 - val_loss: 1.3458
Epoch 12/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 10s 14ms/step - accuracy: 0.5789 - loss: 1.1932 - val_accuracy: 0.5698 - val_loss: 1.2337
Epoch 13/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 12s 17ms/step - accuracy: 0.5930 - loss: 1.1549 - val_accuracy: 0.5899 - val_loss: 1.1699
Epoch 14/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 10s 15ms/step - accuracy: 0.6008 - loss: 1.1321 - val_accuracy: 0.6103 - val_loss: 1.1278
Epoch 15/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 10s 15ms/step - accuracy: 0.6127 - loss: 1.0989 - val_accuracy: 0.6005 - val_loss: 1.1457
313/313 - 1s - 4ms/step - accuracy: 0.5973 - loss: 1.1392
Test accuracy: 0.5972999930381775
In [ ]:
plt.figure(figsize=(10, 6))
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.axhline(y=test_acc, c='r',  linestyle='--', label=f'Test Accuracy of ANN: {test_acc:.4f}')
plt.axhline(y=test_acc1, c='g' ,linestyle='--', label=f'Test Accuracy of CNN: {test_acc1:.4f}')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.title('Training and Validation Accuracy over 15 Epochs of CNN built using tensor flow model')
plt.legend()
plt.grid(True)
plt.show()
No description has been provided for this image
In [ ]:
from tensorflow.keras.preprocessing import image
import matplotlib.pyplot as plt
import numpy as np

# Load and preprocess the new image
def load_and_preprocess_image(img_path):
    plt.imshow(image.load_img(img_path))  # Resize image to 32x32
    img = image.load_img(img_path, target_size=(32, 32))
    img_array = image.img_to_array(img)  # Convert image to array
    img_array = np.expand_dims(img_array, axis=0)  # Add batch dimension
    img_array = img_array / 255.0  # Normalize to [0, 1] range
    return img_array

# Function to predict the class of a new image
def predict_image_class(model, img_path):
    new_image = load_and_preprocess_image(img_path)
    predictions = model.predict(new_image)
    predicted_class = np.argmax(predictions)
    class_names = ['aeroplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
    predicted_class_name = class_names[predicted_class]
    return predicted_class_name

# Example usage
new_image_path = '/content/frog.jpg'
predicted_class_name = predict_image_class(model, new_image_path)
print(f'The model predicts that the image belongs to class: {predicted_class_name}')
1/1 [==============================] - 0s 90ms/step
The model predicts that the image belongs to class: frog
No description has been provided for this image
In [ ]:
new_image_path = '/content/aeroplane.jpg'
predicted_class_name = predict_image_class(model, new_image_path)
print(f'The model predicts that the image belongs to class: {predicted_class_name}')
1/1 [==============================] - 0s 29ms/step
The model predicts that the image belongs to class: aeroplane
No description has been provided for this image
In [ ]:
new_image_path = '/content/a1.jpg'
predicted_class_name = predict_image_class(model, new_image_path)
print(f'The model predicts that the image belongs to class: {predicted_class_name}')
1/1 [==============================] - 0s 22ms/step
The model predicts that the image belongs to class: aeroplane
No description has been provided for this image
In [ ]:
new_image_path = '/content/horse.jpg'
predicted_class_name = predict_image_class(model, new_image_path)
print(f'The model predicts that the image belongs to class: {predicted_class_name}')
1/1 [==============================] - 0s 19ms/step
The model predicts that the image belongs to class: horse
No description has been provided for this image
In [ ]:
new_image_path = '/content/ship.png'
predicted_class_name = predict_image_class(model, new_image_path)
print(f'The model predicts that the image belongs to class: {predicted_class_name}')
1/1 [==============================] - 0s 41ms/step
The model predicts that the image belongs to class: ship
No description has been provided for this image

Experiment 2.3: Understand the behaviour of role of Network Architecture’s complexity. Work on understanding the effect of no of layers, no of neurons in each layer and effect of activation functions on models’ performance.¶

Dense ANN¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
from sklearn.model_selection import train_test_split

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()
train_images, test_images = train_images / 255.0, test_images / 255.0
train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)


model = models.Sequential([
    layers.Flatten(input_shape=(32, 32, 3)),  
    layers.Dense(256, activation='relu'),  
    layers.Dense(512, activation='relu'),
    layers.Dense(512, activation='relu'),
    layers.Dense(256, activation='relu'),
    layers.Dense(128, activation='relu'),
    layers.Dense(128, activation='relu'),
    layers.Dense(64, activation='relu'),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')  
])

model.compile(optimizer='sgd', 
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=15,
                    validation_data=(val_images, val_labels))

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'Test accuracy: {test_acc}')
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Epoch 1/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 7s 5ms/step - accuracy: 0.1863 - loss: 2.1786 - val_accuracy: 0.2859 - val_loss: 2.0030
Epoch 2/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.3319 - loss: 1.8535 - val_accuracy: 0.3753 - val_loss: 1.7383
Epoch 3/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 5ms/step - accuracy: 0.3816 - loss: 1.7135 - val_accuracy: 0.3890 - val_loss: 1.7013
Epoch 4/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.4151 - loss: 1.6337 - val_accuracy: 0.4313 - val_loss: 1.5896
Epoch 5/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.4343 - loss: 1.5674 - val_accuracy: 0.4232 - val_loss: 1.6246
Epoch 6/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.4513 - loss: 1.5275 - val_accuracy: 0.4389 - val_loss: 1.5740
Epoch 7/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 5ms/step - accuracy: 0.4698 - loss: 1.4774 - val_accuracy: 0.4558 - val_loss: 1.5225
Epoch 8/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.4848 - loss: 1.4395 - val_accuracy: 0.4653 - val_loss: 1.5175
Epoch 9/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 7s 5ms/step - accuracy: 0.5014 - loss: 1.3975 - val_accuracy: 0.4421 - val_loss: 1.5512
Epoch 10/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.5057 - loss: 1.3737 - val_accuracy: 0.4731 - val_loss: 1.5004
Epoch 11/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.5215 - loss: 1.3446 - val_accuracy: 0.4952 - val_loss: 1.4163
Epoch 12/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 5ms/step - accuracy: 0.5268 - loss: 1.3225 - val_accuracy: 0.4925 - val_loss: 1.4296
Epoch 13/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.5433 - loss: 1.2839 - val_accuracy: 0.4983 - val_loss: 1.4384
Epoch 14/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 5ms/step - accuracy: 0.5488 - loss: 1.2590 - val_accuracy: 0.5116 - val_loss: 1.3803
Epoch 15/15
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 5ms/step - accuracy: 0.5580 - loss: 1.2270 - val_accuracy: 0.5087 - val_loss: 1.3851
313/313 - 1s - 2ms/step - accuracy: 0.5087 - loss: 1.3652
Test accuracy: 0.5087000131607056
In [ ]:
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.axhline(y=test_acc, color='r', linestyle='--', label=f'Test Accuracy: {test_acc:.4f}')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.title('Training and Validation Accuracy over 15 Epochs for dense ANN')
plt.legend()
plt.grid(True)
plt.show()
No description has been provided for this image

Dense CNN¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
from sklearn.model_selection import train_test_split

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()
train_images, test_images = train_images / 255.0, test_images / 255.0
train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)


model = models.Sequential([
    layers.Conv2D(256, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(256, (3, 3), activation='relu', padding='same'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(128, (3, 3), activation='relu', padding='same'),
    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dense(128, activation='relu'),
    layers.Dense(64, activation='relu'),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

model.compile(optimizer='sgd',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=15, batch_size=64,
                    validation_data=(val_images, val_labels))

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'Test accuracy: {test_acc}')
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\convolutional\base_conv.py:107: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(activity_regularizer=activity_regularizer, **kwargs)
Epoch 1/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 168s 240ms/step - accuracy: 0.1322 - loss: 2.2889 - val_accuracy: 0.1851 - val_loss: 2.1450
Epoch 2/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 159s 229ms/step - accuracy: 0.2335 - loss: 2.0681 - val_accuracy: 0.3177 - val_loss: 1.8946
Epoch 3/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 165s 238ms/step - accuracy: 0.3290 - loss: 1.8680 - val_accuracy: 0.3894 - val_loss: 1.6980
Epoch 4/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 161s 232ms/step - accuracy: 0.3988 - loss: 1.6747 - val_accuracy: 0.4135 - val_loss: 1.6278
Epoch 5/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 159s 228ms/step - accuracy: 0.4411 - loss: 1.5462 - val_accuracy: 0.4497 - val_loss: 1.4974
Epoch 6/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 158s 228ms/step - accuracy: 0.4740 - loss: 1.4549 - val_accuracy: 0.4725 - val_loss: 1.4256
Epoch 7/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 158s 228ms/step - accuracy: 0.5056 - loss: 1.3737 - val_accuracy: 0.4594 - val_loss: 1.4897
Epoch 8/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 158s 228ms/step - accuracy: 0.5338 - loss: 1.2976 - val_accuracy: 0.5458 - val_loss: 1.2752
Epoch 9/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 159s 229ms/step - accuracy: 0.5583 - loss: 1.2318 - val_accuracy: 0.5233 - val_loss: 1.3216
Epoch 10/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 159s 229ms/step - accuracy: 0.5915 - loss: 1.1573 - val_accuracy: 0.5532 - val_loss: 1.2716
Epoch 11/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 159s 228ms/step - accuracy: 0.6141 - loss: 1.0845 - val_accuracy: 0.5584 - val_loss: 1.2232
Epoch 12/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 160s 230ms/step - accuracy: 0.6383 - loss: 1.0245 - val_accuracy: 0.6020 - val_loss: 1.1348
Epoch 13/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 161s 232ms/step - accuracy: 0.6547 - loss: 0.9722 - val_accuracy: 0.6455 - val_loss: 1.0083
Epoch 14/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 160s 230ms/step - accuracy: 0.6814 - loss: 0.9044 - val_accuracy: 0.5201 - val_loss: 1.4356
Epoch 15/15
695/695 ━━━━━━━━━━━━━━━━━━━━ 159s 229ms/step - accuracy: 0.6992 - loss: 0.8627 - val_accuracy: 0.6263 - val_loss: 1.0840
313/313 - 11s - 34ms/step - accuracy: 0.6286 - loss: 1.0693
Test accuracy: 0.628600001335144
In [ ]:
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.axhline(y=test_acc, color='r', linestyle='--', label=f'Test Accuracy: {test_acc:.4f}')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.title('Training and Validation Accuracy over 15 Epochs for Dense CNN')
plt.legend()
plt.grid(True)
plt.show()
No description has been provided for this image

Activation function experiments¶

Experiment to study the model's performance when using both Relu and sigmoid activation functions.¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
from sklearn.model_selection import train_test_split

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

model = models.Sequential([
    layers.Flatten(input_shape=(32, 32, 3)), 
    layers.Dense(256, activation='relu'),  
    layers.Dense(512, activation='sigmoid'),
    layers.Dense(512, activation='relu'),
    layers.Dense(256, activation='relu'),
    layers.Dense(128, activation='sigmoid'),
    layers.Dense(128, activation='sigmoid'),
    layers.Dense(64, activation='relu'),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')  
])

model.compile(optimizer='sgd',  
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])


history = model.fit(train_images, train_labels, epochs=20,
                    validation_data=(val_images, val_labels))

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'Test accuracy: {test_acc}')
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Epoch 1/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 7s 5ms/step - accuracy: 0.0981 - loss: 2.3061 - val_accuracy: 0.1001 - val_loss: 2.3030
Epoch 2/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.1016 - loss: 2.3036 - val_accuracy: 0.0999 - val_loss: 2.3031
Epoch 3/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.1057 - loss: 2.3026 - val_accuracy: 0.1001 - val_loss: 2.3010
Epoch 4/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.1102 - loss: 2.3006 - val_accuracy: 0.1267 - val_loss: 2.2928
Epoch 5/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.1351 - loss: 2.2815 - val_accuracy: 0.1770 - val_loss: 2.1606
Epoch 6/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.1688 - loss: 2.1210 - val_accuracy: 0.1878 - val_loss: 2.0780
Epoch 7/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.1897 - loss: 2.0562 - val_accuracy: 0.1951 - val_loss: 2.0433
Epoch 8/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.1974 - loss: 2.0409 - val_accuracy: 0.2139 - val_loss: 2.0120
Epoch 9/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.2000 - loss: 2.0190 - val_accuracy: 0.2189 - val_loss: 1.9887
Epoch 10/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.2051 - loss: 2.0049 - val_accuracy: 0.2103 - val_loss: 1.9945
Epoch 11/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.2120 - loss: 1.9873 - val_accuracy: 0.2158 - val_loss: 1.9660
Epoch 12/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.2187 - loss: 1.9747 - val_accuracy: 0.2292 - val_loss: 1.9501
Epoch 13/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.2419 - loss: 1.9470 - val_accuracy: 0.2668 - val_loss: 1.8836
Epoch 14/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.2712 - loss: 1.8756 - val_accuracy: 0.2794 - val_loss: 1.8545
Epoch 15/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.2841 - loss: 1.8419 - val_accuracy: 0.3084 - val_loss: 1.8354
Epoch 16/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.2941 - loss: 1.8242 - val_accuracy: 0.3170 - val_loss: 1.8015
Epoch 17/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.3051 - loss: 1.8081 - val_accuracy: 0.3199 - val_loss: 1.7816
Epoch 18/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.3091 - loss: 1.7920 - val_accuracy: 0.3266 - val_loss: 1.7769
Epoch 19/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.3151 - loss: 1.7795 - val_accuracy: 0.3176 - val_loss: 1.7832
Epoch 20/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.3239 - loss: 1.7637 - val_accuracy: 0.3271 - val_loss: 1.7830
313/313 - 1s - 2ms/step - accuracy: 0.3292 - loss: 1.7727
Test accuracy: 0.32919999957084656
In [ ]:
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.axhline(y=test_acc, color='r', linestyle='--', label=f'Test Accuracy: {test_acc:.4f}')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.title('Training and Validation Accuracy over 20 Epochs with sigmoid and relu activation fucntions.')
plt.legend()
plt.grid(True)
plt.show()
No description has been provided for this image

Experiment to study the model's performance when using relu, elu, selu, tanh and sigmiod activation fucntions.¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
from sklearn.model_selection import train_test_split

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()
train_images, test_images = train_images / 255.0, test_images / 255.0
train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

model = models.Sequential([
    layers.Flatten(input_shape=(32, 32, 3)), 
    layers.Dense(128, activation='relu'),  
    layers.Dense(128, activation='tanh'),  
    layers.Dense(128, activation='elu'),   
    layers.Dense(64, activation='selu'),  
    layers.Dense(64, activation='sigmoid'),  
    layers.Dense(32, activation='tanh'),   
    layers.Dense(32, activation='elu'),   
    layers.Dense(10, activation='softmax')  
])

model.compile(optimizer='sgd',  
              loss='sparse_categorical_crossentropy',  
              metrics=['accuracy'])  


history = model.fit(train_images, train_labels, epochs=20,
                    validation_data=(val_images, val_labels))


test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'Test accuracy: {test_acc}')
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Epoch 1/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.1810 - loss: 2.1876 - val_accuracy: 0.3123 - val_loss: 1.9055
Epoch 2/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.3235 - loss: 1.8807 - val_accuracy: 0.3784 - val_loss: 1.7500
Epoch 3/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.3713 - loss: 1.7434 - val_accuracy: 0.4090 - val_loss: 1.6565
Epoch 4/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.4003 - loss: 1.6563 - val_accuracy: 0.3953 - val_loss: 1.6640
Epoch 5/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.4203 - loss: 1.5955 - val_accuracy: 0.4385 - val_loss: 1.5918
Epoch 6/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.4376 - loss: 1.5506 - val_accuracy: 0.4308 - val_loss: 1.5840
Epoch 7/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.4573 - loss: 1.5062 - val_accuracy: 0.4502 - val_loss: 1.5623
Epoch 8/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.4730 - loss: 1.4744 - val_accuracy: 0.4731 - val_loss: 1.4856
Epoch 9/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.4794 - loss: 1.4474 - val_accuracy: 0.4722 - val_loss: 1.4713
Epoch 10/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.4906 - loss: 1.4098 - val_accuracy: 0.4781 - val_loss: 1.4613
Epoch 11/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5026 - loss: 1.3923 - val_accuracy: 0.4848 - val_loss: 1.4514
Epoch 12/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5075 - loss: 1.3779 - val_accuracy: 0.4904 - val_loss: 1.4248
Epoch 13/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5137 - loss: 1.3552 - val_accuracy: 0.4889 - val_loss: 1.4458
Epoch 14/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5159 - loss: 1.3469 - val_accuracy: 0.4911 - val_loss: 1.4230
Epoch 15/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5314 - loss: 1.3091 - val_accuracy: 0.4945 - val_loss: 1.4200
Epoch 16/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5340 - loss: 1.3012 - val_accuracy: 0.4974 - val_loss: 1.4187
Epoch 17/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5407 - loss: 1.2839 - val_accuracy: 0.4988 - val_loss: 1.4023
Epoch 18/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5467 - loss: 1.2719 - val_accuracy: 0.4992 - val_loss: 1.4182
Epoch 19/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.5560 - loss: 1.2464 - val_accuracy: 0.4985 - val_loss: 1.4155
Epoch 20/20
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5542 - loss: 1.2455 - val_accuracy: 0.5203 - val_loss: 1.3653
313/313 - 0s - 2ms/step - accuracy: 0.5189 - loss: 1.3473
Test accuracy: 0.5188999772071838
In [ ]:
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.axhline(y=test_acc, color='r', linestyle='--', label=f'Test Accuracy: {test_acc:.4f}')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.title('Training and Validation Accuracy over 20 Epochs with relu, elu, selu, tanh and sigmiod activation fucntions.')
plt.legend()
plt.grid(True)
plt.show()
No description has been provided for this image

Experiment to study the model's performance when using relu, elu, selu, tanh and sigmiod activation fucntions individaully .¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

activation_functions = ['relu', 'tanh', 'elu', 'selu', 'sigmoid']

results = {}

for activation in activation_functions:
    print(f"Training model with {activation} activation...")
    
    model = models.Sequential([
        layers.Flatten(input_shape=(32, 32, 3)),
        layers.Dense(128, activation=activation),
        layers.Dense(128, activation=activation),
        layers.Dense(128, activation=activation),
        layers.Dense(64, activation=activation),
        layers.Dense(64, activation=activation),
        layers.Dense(32, activation=activation),
        layers.Dense(32, activation=activation),
        layers.Dense(10, activation='softmax')
    ])

    model.compile(optimizer='sgd',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    history = model.fit(train_images, train_labels, epochs=10,
                        validation_data=(val_images, val_labels),
                        verbose=0)
    
    val_acc = max(history.history['val_accuracy'])
    results[activation] = {
        'val_acc': val_acc
    }

    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)
    results[activation]['test_acc'] = test_acc

    print(f"{activation} - Validation Accuracy: {val_acc:.4f}, Test Accuracy: {test_acc:.4f}")

# Extracting results for plotting
activation_names = []
val_accuracies = []
test_accuracies = []

for activation in activation_functions:
    activation_names.append(activation)
    val_accuracies.append(results[activation]['val_acc'])
    test_accuracies.append(results[activation]['test_acc'])
Training model with relu activation...
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
relu - Validation Accuracy: 0.4625, Test Accuracy: 0.4705
Training model with tanh activation...
tanh - Validation Accuracy: 0.4695, Test Accuracy: 0.4721
Training model with elu activation...
elu - Validation Accuracy: 0.4851, Test Accuracy: 0.4840
Training model with selu activation...
selu - Validation Accuracy: 0.4738, Test Accuracy: 0.4812
Training model with sigmoid activation...
sigmoid - Validation Accuracy: 0.1001, Test Accuracy: 0.1000
In [ ]:
plt.figure(figsize=(10, 6))
plt.plot(activation_names, val_accuracies, marker='o', linestyle='-', color='b', label='Validation Accuracy')
plt.plot(activation_names, test_accuracies, marker='x', linestyle='-', color='r', label='Test Accuracy')
plt.title('Max Validation Accuracy vs Test Accuracy for Different Activation Functions')
plt.xlabel('Activation Functions')
plt.ylabel('Accuracy')
plt.xticks(rotation=45)
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
No description has been provided for this image

Experiment 2.4: Understand the Epochs and find the optimal number of epochs to train the model by considering Overfitting and Underfitting problems.¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
from sklearn.model_selection import train_test_split

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

model = models.Sequential([
    layers.Flatten(input_shape=(32, 32, 3)),
    layers.Dense(256, activation='relu'),
    layers.Dense(512, activation='relu'),
    layers.Dense(512, activation='relu'),
    layers.Dense(256, activation='relu'),
    layers.Dense(128, activation='relu'),
    layers.Dense(128, activation='relu'),
    layers.Dense(64, activation='relu'),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

model.compile(optimizer='sgd',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=250,
                    validation_data=(val_images, val_labels))

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'Test accuracy: {test_acc}')
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Epoch 1/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.2072 - loss: 2.1500 - val_accuracy: 0.3447 - val_loss: 1.8308
Epoch 2/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.3435 - loss: 1.8188 - val_accuracy: 0.3870 - val_loss: 1.7091
Epoch 3/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.3890 - loss: 1.6942 - val_accuracy: 0.3879 - val_loss: 1.7057
Epoch 4/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.4182 - loss: 1.6164 - val_accuracy: 0.4041 - val_loss: 1.6668
Epoch 5/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.4415 - loss: 1.5550 - val_accuracy: 0.4445 - val_loss: 1.5384
Epoch 6/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.4532 - loss: 1.5109 - val_accuracy: 0.4432 - val_loss: 1.5440
Epoch 7/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.4746 - loss: 1.4596 - val_accuracy: 0.4565 - val_loss: 1.5206
Epoch 8/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.4890 - loss: 1.4218 - val_accuracy: 0.4711 - val_loss: 1.4530
Epoch 9/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.5028 - loss: 1.3896 - val_accuracy: 0.4711 - val_loss: 1.4774
Epoch 10/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.5090 - loss: 1.3558 - val_accuracy: 0.4756 - val_loss: 1.4504
Epoch 11/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.5264 - loss: 1.3220 - val_accuracy: 0.4967 - val_loss: 1.4128
Epoch 12/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.5403 - loss: 1.2872 - val_accuracy: 0.4950 - val_loss: 1.4311
Epoch 13/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.5521 - loss: 1.2549 - val_accuracy: 0.5118 - val_loss: 1.3790
Epoch 14/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.5628 - loss: 1.2321 - val_accuracy: 0.5109 - val_loss: 1.3820
Epoch 15/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.5741 - loss: 1.1936 - val_accuracy: 0.4907 - val_loss: 1.4856
Epoch 16/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.5802 - loss: 1.1713 - val_accuracy: 0.5143 - val_loss: 1.4008
Epoch 17/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.5871 - loss: 1.1517 - val_accuracy: 0.4889 - val_loss: 1.4276
Epoch 18/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.6038 - loss: 1.1126 - val_accuracy: 0.5100 - val_loss: 1.3899
Epoch 19/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.6078 - loss: 1.0897 - val_accuracy: 0.5154 - val_loss: 1.4128
Epoch 20/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.6250 - loss: 1.0500 - val_accuracy: 0.5098 - val_loss: 1.4180
Epoch 21/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.6315 - loss: 1.0279 - val_accuracy: 0.4999 - val_loss: 1.4507
Epoch 22/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.6443 - loss: 0.9982 - val_accuracy: 0.5195 - val_loss: 1.3917
Epoch 23/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.6499 - loss: 0.9712 - val_accuracy: 0.5231 - val_loss: 1.4065
Epoch 24/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.6617 - loss: 0.9511 - val_accuracy: 0.5053 - val_loss: 1.4825
Epoch 25/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.6735 - loss: 0.9121 - val_accuracy: 0.5165 - val_loss: 1.4255
Epoch 26/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.6851 - loss: 0.8807 - val_accuracy: 0.4968 - val_loss: 1.4691
Epoch 27/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.6914 - loss: 0.8556 - val_accuracy: 0.5285 - val_loss: 1.4599
Epoch 28/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.7037 - loss: 0.8300 - val_accuracy: 0.5001 - val_loss: 1.5493
Epoch 29/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.7116 - loss: 0.8030 - val_accuracy: 0.4905 - val_loss: 1.6221
Epoch 30/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.7219 - loss: 0.7778 - val_accuracy: 0.5113 - val_loss: 1.5405
Epoch 31/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.7374 - loss: 0.7338 - val_accuracy: 0.5267 - val_loss: 1.5640
Epoch 32/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.7472 - loss: 0.7084 - val_accuracy: 0.5208 - val_loss: 1.5825
Epoch 33/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.7554 - loss: 0.6822 - val_accuracy: 0.5077 - val_loss: 1.7122
Epoch 34/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 7s 5ms/step - accuracy: 0.7661 - loss: 0.6538 - val_accuracy: 0.5228 - val_loss: 1.6666
Epoch 35/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.7726 - loss: 0.6331 - val_accuracy: 0.5215 - val_loss: 1.6935
Epoch 36/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.7867 - loss: 0.5970 - val_accuracy: 0.5122 - val_loss: 1.7492
Epoch 37/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.7955 - loss: 0.5742 - val_accuracy: 0.5194 - val_loss: 1.7451
Epoch 38/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8019 - loss: 0.5460 - val_accuracy: 0.5129 - val_loss: 1.8506
Epoch 39/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8109 - loss: 0.5290 - val_accuracy: 0.5177 - val_loss: 1.7756
Epoch 40/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8186 - loss: 0.5037 - val_accuracy: 0.5163 - val_loss: 1.8981
Epoch 41/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8329 - loss: 0.4698 - val_accuracy: 0.5170 - val_loss: 1.9701
Epoch 42/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8361 - loss: 0.4583 - val_accuracy: 0.5251 - val_loss: 1.9482
Epoch 43/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8475 - loss: 0.4273 - val_accuracy: 0.5136 - val_loss: 1.8617
Epoch 44/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8590 - loss: 0.3978 - val_accuracy: 0.5046 - val_loss: 2.0659
Epoch 45/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8595 - loss: 0.3981 - val_accuracy: 0.5123 - val_loss: 2.0784
Epoch 46/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8609 - loss: 0.3882 - val_accuracy: 0.5176 - val_loss: 2.0736
Epoch 47/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8725 - loss: 0.3618 - val_accuracy: 0.5077 - val_loss: 2.3448
Epoch 48/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8724 - loss: 0.3549 - val_accuracy: 0.5051 - val_loss: 2.1488
Epoch 49/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8805 - loss: 0.3341 - val_accuracy: 0.5258 - val_loss: 2.1849
Epoch 50/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8939 - loss: 0.3080 - val_accuracy: 0.5208 - val_loss: 2.2690
Epoch 51/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8991 - loss: 0.2869 - val_accuracy: 0.5125 - val_loss: 2.2860
Epoch 52/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8981 - loss: 0.2860 - val_accuracy: 0.5028 - val_loss: 2.5545
Epoch 53/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9038 - loss: 0.2714 - val_accuracy: 0.4974 - val_loss: 2.6274
Epoch 54/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9129 - loss: 0.2462 - val_accuracy: 0.5104 - val_loss: 2.4207
Epoch 55/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 7s 5ms/step - accuracy: 0.9129 - loss: 0.2498 - val_accuracy: 0.5127 - val_loss: 2.4377
Epoch 56/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9164 - loss: 0.2335 - val_accuracy: 0.5046 - val_loss: 2.6103
Epoch 57/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9145 - loss: 0.2349 - val_accuracy: 0.5082 - val_loss: 2.5960
Epoch 58/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9226 - loss: 0.2174 - val_accuracy: 0.5176 - val_loss: 2.6766
Epoch 59/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9247 - loss: 0.2153 - val_accuracy: 0.5221 - val_loss: 2.6882
Epoch 60/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9265 - loss: 0.2095 - val_accuracy: 0.5032 - val_loss: 2.6744
Epoch 61/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9303 - loss: 0.2003 - val_accuracy: 0.5152 - val_loss: 2.7777
Epoch 62/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9336 - loss: 0.1936 - val_accuracy: 0.5051 - val_loss: 2.7956
Epoch 63/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9340 - loss: 0.1918 - val_accuracy: 0.5176 - val_loss: 2.7753
Epoch 64/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9413 - loss: 0.1681 - val_accuracy: 0.5156 - val_loss: 2.7014
Epoch 65/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9495 - loss: 0.1467 - val_accuracy: 0.5073 - val_loss: 2.8085
Epoch 66/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9416 - loss: 0.1669 - val_accuracy: 0.5145 - val_loss: 2.8467
Epoch 67/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9468 - loss: 0.1527 - val_accuracy: 0.5179 - val_loss: 2.7407
Epoch 68/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9598 - loss: 0.1209 - val_accuracy: 0.5129 - val_loss: 3.0803
Epoch 69/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9463 - loss: 0.1543 - val_accuracy: 0.5059 - val_loss: 2.9726
Epoch 70/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9534 - loss: 0.1369 - val_accuracy: 0.5210 - val_loss: 3.1842
Epoch 71/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 10s 4ms/step - accuracy: 0.9452 - loss: 0.1587 - val_accuracy: 0.5105 - val_loss: 3.0775
Epoch 72/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9519 - loss: 0.1346 - val_accuracy: 0.5158 - val_loss: 3.0867
Epoch 73/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9624 - loss: 0.1061 - val_accuracy: 0.5226 - val_loss: 3.1048
Epoch 74/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9576 - loss: 0.1248 - val_accuracy: 0.5152 - val_loss: 3.1157
Epoch 75/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9575 - loss: 0.1264 - val_accuracy: 0.5021 - val_loss: 3.2385
Epoch 76/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9599 - loss: 0.1168 - val_accuracy: 0.5212 - val_loss: 3.0493
Epoch 77/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9741 - loss: 0.0765 - val_accuracy: 0.5172 - val_loss: 3.1752
Epoch 78/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9672 - loss: 0.1003 - val_accuracy: 0.5197 - val_loss: 3.1684
Epoch 79/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9703 - loss: 0.0893 - val_accuracy: 0.5156 - val_loss: 3.2200
Epoch 80/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9685 - loss: 0.0921 - val_accuracy: 0.5140 - val_loss: 3.2555
Epoch 81/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9719 - loss: 0.0858 - val_accuracy: 0.5077 - val_loss: 3.2600
Epoch 82/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9743 - loss: 0.0756 - val_accuracy: 0.5023 - val_loss: 3.2612
Epoch 83/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9672 - loss: 0.0959 - val_accuracy: 0.5210 - val_loss: 3.0783
Epoch 84/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9753 - loss: 0.0756 - val_accuracy: 0.5176 - val_loss: 3.5292
Epoch 85/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9680 - loss: 0.0917 - val_accuracy: 0.5167 - val_loss: 3.5173
Epoch 86/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9748 - loss: 0.0765 - val_accuracy: 0.5154 - val_loss: 3.4571
Epoch 87/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9715 - loss: 0.0819 - val_accuracy: 0.5249 - val_loss: 3.4263
Epoch 88/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9677 - loss: 0.0940 - val_accuracy: 0.5017 - val_loss: 3.7582
Epoch 89/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9814 - loss: 0.0573 - val_accuracy: 0.5289 - val_loss: 3.3295
Epoch 90/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9836 - loss: 0.0496 - val_accuracy: 0.5197 - val_loss: 3.3825
Epoch 91/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9777 - loss: 0.0664 - val_accuracy: 0.5266 - val_loss: 3.6913
Epoch 92/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9815 - loss: 0.0564 - val_accuracy: 0.5186 - val_loss: 3.6086
Epoch 93/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9719 - loss: 0.0829 - val_accuracy: 0.4844 - val_loss: 3.6415
Epoch 94/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9794 - loss: 0.0624 - val_accuracy: 0.5190 - val_loss: 3.5670
Epoch 95/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9765 - loss: 0.0694 - val_accuracy: 0.5269 - val_loss: 3.4937
Epoch 96/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9831 - loss: 0.0520 - val_accuracy: 0.5161 - val_loss: 3.5786
Epoch 97/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9801 - loss: 0.0617 - val_accuracy: 0.5312 - val_loss: 3.4056
Epoch 98/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9878 - loss: 0.0381 - val_accuracy: 0.5161 - val_loss: 3.7531
Epoch 99/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9778 - loss: 0.0668 - val_accuracy: 0.5248 - val_loss: 3.6333
Epoch 100/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9931 - loss: 0.0210 - val_accuracy: 0.5188 - val_loss: 4.2104
Epoch 101/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9787 - loss: 0.0622 - val_accuracy: 0.5244 - val_loss: 3.6484
Epoch 102/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9782 - loss: 0.0626 - val_accuracy: 0.5163 - val_loss: 3.6079
Epoch 103/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9873 - loss: 0.0393 - val_accuracy: 0.5141 - val_loss: 3.8679
Epoch 104/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9809 - loss: 0.0592 - val_accuracy: 0.5158 - val_loss: 3.6717
Epoch 105/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9860 - loss: 0.0421 - val_accuracy: 0.5237 - val_loss: 3.9065
Epoch 106/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9771 - loss: 0.0664 - val_accuracy: 0.5233 - val_loss: 3.7700
Epoch 107/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9903 - loss: 0.0296 - val_accuracy: 0.5082 - val_loss: 3.8700
Epoch 108/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9785 - loss: 0.0656 - val_accuracy: 0.5143 - val_loss: 3.6294
Epoch 109/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9888 - loss: 0.0355 - val_accuracy: 0.5334 - val_loss: 3.6645
Epoch 110/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9885 - loss: 0.0375 - val_accuracy: 0.5264 - val_loss: 3.9774
Epoch 111/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9903 - loss: 0.0301 - val_accuracy: 0.5287 - val_loss: 3.8663
Epoch 112/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9812 - loss: 0.0601 - val_accuracy: 0.5185 - val_loss: 3.8645
Epoch 113/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9886 - loss: 0.0357 - val_accuracy: 0.5069 - val_loss: 3.7365
Epoch 114/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9787 - loss: 0.0632 - val_accuracy: 0.5316 - val_loss: 3.8934
Epoch 115/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9837 - loss: 0.0497 - val_accuracy: 0.5174 - val_loss: 3.8121
Epoch 116/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9857 - loss: 0.0425 - val_accuracy: 0.5273 - val_loss: 3.9523
Epoch 117/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9934 - loss: 0.0206 - val_accuracy: 0.5188 - val_loss: 3.7524
Epoch 118/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9879 - loss: 0.0356 - val_accuracy: 0.5285 - val_loss: 3.8977
Epoch 119/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9879 - loss: 0.0368 - val_accuracy: 0.5204 - val_loss: 4.0439
Epoch 120/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9954 - loss: 0.0139 - val_accuracy: 0.5221 - val_loss: 4.1767
Epoch 121/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9786 - loss: 0.0640 - val_accuracy: 0.5192 - val_loss: 4.0237
Epoch 122/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9859 - loss: 0.0413 - val_accuracy: 0.5228 - val_loss: 4.0423
Epoch 123/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9918 - loss: 0.0232 - val_accuracy: 0.5291 - val_loss: 4.3082
Epoch 124/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9838 - loss: 0.0486 - val_accuracy: 0.5260 - val_loss: 3.8466
Epoch 125/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9931 - loss: 0.0227 - val_accuracy: 0.5177 - val_loss: 4.0705
Epoch 126/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9876 - loss: 0.0381 - val_accuracy: 0.5289 - val_loss: 4.0207
Epoch 127/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9862 - loss: 0.0413 - val_accuracy: 0.5219 - val_loss: 3.7121
Epoch 128/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9912 - loss: 0.0249 - val_accuracy: 0.5296 - val_loss: 4.1307
Epoch 129/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9947 - loss: 0.0179 - val_accuracy: 0.5134 - val_loss: 4.1618
Epoch 130/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9780 - loss: 0.0638 - val_accuracy: 0.5235 - val_loss: 4.2559
Epoch 131/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9945 - loss: 0.0184 - val_accuracy: 0.5311 - val_loss: 4.2351
Epoch 132/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9954 - loss: 0.0140 - val_accuracy: 0.5384 - val_loss: 4.3834
Epoch 133/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9998 - loss: 0.0012 - val_accuracy: 0.5419 - val_loss: 4.4810
Epoch 134/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9998 - loss: 8.6617e-04 - val_accuracy: 0.5408 - val_loss: 4.5456
Epoch 135/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 3.5140e-04 - val_accuracy: 0.5438 - val_loss: 4.5911
Epoch 136/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.0309e-04 - val_accuracy: 0.5426 - val_loss: 4.6324
Epoch 137/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9999 - loss: 2.8975e-04 - val_accuracy: 0.5460 - val_loss: 4.6782
Epoch 138/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.1135e-04 - val_accuracy: 0.5467 - val_loss: 4.7128
Epoch 139/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 9.9011e-05 - val_accuracy: 0.5465 - val_loss: 4.7379
Epoch 140/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 8.6355e-05 - val_accuracy: 0.5467 - val_loss: 4.7666
Epoch 141/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 8.8201e-05 - val_accuracy: 0.5467 - val_loss: 4.7892
Epoch 142/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 7.3280e-05 - val_accuracy: 0.5469 - val_loss: 4.8145
Epoch 143/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 6.4985e-05 - val_accuracy: 0.5476 - val_loss: 4.8357
Epoch 144/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 6.2649e-05 - val_accuracy: 0.5476 - val_loss: 4.8549
Epoch 145/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 6.3361e-05 - val_accuracy: 0.5467 - val_loss: 4.8764
Epoch 146/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 5.9051e-05 - val_accuracy: 0.5473 - val_loss: 4.8938
Epoch 147/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 5.4666e-05 - val_accuracy: 0.5474 - val_loss: 4.9101
Epoch 148/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 5.5628e-05 - val_accuracy: 0.5476 - val_loss: 4.9278
Epoch 149/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 4.8171e-05 - val_accuracy: 0.5476 - val_loss: 4.9431
Epoch 150/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 4.5762e-05 - val_accuracy: 0.5478 - val_loss: 4.9590
Epoch 151/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 4.4647e-05 - val_accuracy: 0.5483 - val_loss: 4.9737
Epoch 152/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 4.5413e-05 - val_accuracy: 0.5482 - val_loss: 4.9877
Epoch 153/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 4.2522e-05 - val_accuracy: 0.5487 - val_loss: 5.0019
Epoch 154/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 3.9756e-05 - val_accuracy: 0.5491 - val_loss: 5.0152
Epoch 155/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 4.0016e-05 - val_accuracy: 0.5487 - val_loss: 5.0269
Epoch 156/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 3.6800e-05 - val_accuracy: 0.5485 - val_loss: 5.0400
Epoch 157/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 3.5591e-05 - val_accuracy: 0.5487 - val_loss: 5.0517
Epoch 158/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 3.5389e-05 - val_accuracy: 0.5489 - val_loss: 5.0628
Epoch 159/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 3.4926e-05 - val_accuracy: 0.5498 - val_loss: 5.0736
Epoch 160/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 3.4409e-05 - val_accuracy: 0.5491 - val_loss: 5.0851
Epoch 161/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 3.3260e-05 - val_accuracy: 0.5498 - val_loss: 5.0958
Epoch 162/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 3.3408e-05 - val_accuracy: 0.5492 - val_loss: 5.1062
Epoch 163/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.9798e-05 - val_accuracy: 0.5496 - val_loss: 5.1154
Epoch 164/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 5ms/step - accuracy: 1.0000 - loss: 2.7216e-05 - val_accuracy: 0.5491 - val_loss: 5.1256
Epoch 165/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.8598e-05 - val_accuracy: 0.5489 - val_loss: 5.1350
Epoch 166/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.7904e-05 - val_accuracy: 0.5489 - val_loss: 5.1449
Epoch 167/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.5934e-05 - val_accuracy: 0.5489 - val_loss: 5.1533
Epoch 168/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.7172e-05 - val_accuracy: 0.5489 - val_loss: 5.1621
Epoch 169/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.5764e-05 - val_accuracy: 0.5494 - val_loss: 5.1712
Epoch 170/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.5062e-05 - val_accuracy: 0.5494 - val_loss: 5.1799
Epoch 171/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.4111e-05 - val_accuracy: 0.5494 - val_loss: 5.1880
Epoch 172/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.4673e-05 - val_accuracy: 0.5494 - val_loss: 5.1967
Epoch 173/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.3050e-05 - val_accuracy: 0.5489 - val_loss: 5.2047
Epoch 174/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.3125e-05 - val_accuracy: 0.5494 - val_loss: 5.2128
Epoch 175/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.2368e-05 - val_accuracy: 0.5494 - val_loss: 5.2200
Epoch 176/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.3197e-05 - val_accuracy: 0.5496 - val_loss: 5.2273
Epoch 177/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.4221e-05 - val_accuracy: 0.5494 - val_loss: 5.2351
Epoch 178/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.3069e-05 - val_accuracy: 0.5496 - val_loss: 5.2424
Epoch 179/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.1643e-05 - val_accuracy: 0.5496 - val_loss: 5.2496
Epoch 180/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.1028e-05 - val_accuracy: 0.5498 - val_loss: 5.2565
Epoch 181/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.0361e-05 - val_accuracy: 0.5501 - val_loss: 5.2636
Epoch 182/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.0457e-05 - val_accuracy: 0.5500 - val_loss: 5.2704
Epoch 183/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.9859e-05 - val_accuracy: 0.5503 - val_loss: 5.2771
Epoch 184/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 2.0752e-05 - val_accuracy: 0.5505 - val_loss: 5.2840
Epoch 185/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.9516e-05 - val_accuracy: 0.5507 - val_loss: 5.2902
Epoch 186/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.9812e-05 - val_accuracy: 0.5503 - val_loss: 5.2966
Epoch 187/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.9540e-05 - val_accuracy: 0.5507 - val_loss: 5.3028
Epoch 188/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.9347e-05 - val_accuracy: 0.5503 - val_loss: 5.3093
Epoch 189/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.8699e-05 - val_accuracy: 0.5503 - val_loss: 5.3152
Epoch 190/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.8838e-05 - val_accuracy: 0.5501 - val_loss: 5.3210
Epoch 191/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.7265e-05 - val_accuracy: 0.5505 - val_loss: 5.3272
Epoch 192/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.7352e-05 - val_accuracy: 0.5505 - val_loss: 5.3330
Epoch 193/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.6931e-05 - val_accuracy: 0.5505 - val_loss: 5.3389
Epoch 194/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.6377e-05 - val_accuracy: 0.5505 - val_loss: 5.3447
Epoch 195/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.6218e-05 - val_accuracy: 0.5505 - val_loss: 5.3500
Epoch 196/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.5794e-05 - val_accuracy: 0.5507 - val_loss: 5.3555
Epoch 197/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.5729e-05 - val_accuracy: 0.5507 - val_loss: 5.3610
Epoch 198/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.5463e-05 - val_accuracy: 0.5505 - val_loss: 5.3662
Epoch 199/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.5675e-05 - val_accuracy: 0.5505 - val_loss: 5.3717
Epoch 200/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.5103e-05 - val_accuracy: 0.5505 - val_loss: 5.3769
Epoch 201/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.4643e-05 - val_accuracy: 0.5505 - val_loss: 5.3819
Epoch 202/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.4436e-05 - val_accuracy: 0.5503 - val_loss: 5.3872
Epoch 203/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.4275e-05 - val_accuracy: 0.5501 - val_loss: 5.3923
Epoch 204/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.4489e-05 - val_accuracy: 0.5509 - val_loss: 5.3972
Epoch 205/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.4372e-05 - val_accuracy: 0.5507 - val_loss: 5.4020
Epoch 206/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.4198e-05 - val_accuracy: 0.5507 - val_loss: 5.4072
Epoch 207/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.3842e-05 - val_accuracy: 0.5509 - val_loss: 5.4121
Epoch 208/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.3949e-05 - val_accuracy: 0.5509 - val_loss: 5.4169
Epoch 209/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.3284e-05 - val_accuracy: 0.5505 - val_loss: 5.4216
Epoch 210/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.4151e-05 - val_accuracy: 0.5507 - val_loss: 5.4264
Epoch 211/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.3302e-05 - val_accuracy: 0.5507 - val_loss: 5.4312
Epoch 212/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.3476e-05 - val_accuracy: 0.5509 - val_loss: 5.4354
Epoch 213/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.3220e-05 - val_accuracy: 0.5509 - val_loss: 5.4398
Epoch 214/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.2843e-05 - val_accuracy: 0.5509 - val_loss: 5.4445
Epoch 215/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.2868e-05 - val_accuracy: 0.5509 - val_loss: 5.4492
Epoch 216/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.2513e-05 - val_accuracy: 0.5509 - val_loss: 5.4533
Epoch 217/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.2332e-05 - val_accuracy: 0.5509 - val_loss: 5.4577
Epoch 218/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.2085e-05 - val_accuracy: 0.5507 - val_loss: 5.4621
Epoch 219/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.2958e-05 - val_accuracy: 0.5507 - val_loss: 5.4662
Epoch 220/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.2623e-05 - val_accuracy: 0.5507 - val_loss: 5.4705
Epoch 221/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.2175e-05 - val_accuracy: 0.5509 - val_loss: 5.4746
Epoch 222/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.1611e-05 - val_accuracy: 0.5509 - val_loss: 5.4788
Epoch 223/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.1531e-05 - val_accuracy: 0.5509 - val_loss: 5.4829
Epoch 224/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.1761e-05 - val_accuracy: 0.5510 - val_loss: 5.4869
Epoch 225/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.1382e-05 - val_accuracy: 0.5509 - val_loss: 5.4910
Epoch 226/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.0783e-05 - val_accuracy: 0.5509 - val_loss: 5.4949
Epoch 227/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.1820e-05 - val_accuracy: 0.5509 - val_loss: 5.4989
Epoch 228/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.0910e-05 - val_accuracy: 0.5507 - val_loss: 5.5029
Epoch 229/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.0919e-05 - val_accuracy: 0.5505 - val_loss: 5.5068
Epoch 230/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.0761e-05 - val_accuracy: 0.5505 - val_loss: 5.5108
Epoch 231/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.0857e-05 - val_accuracy: 0.5507 - val_loss: 5.5147
Epoch 232/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.1156e-05 - val_accuracy: 0.5507 - val_loss: 5.5183
Epoch 233/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.0924e-05 - val_accuracy: 0.5507 - val_loss: 5.5221
Epoch 234/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 7s 5ms/step - accuracy: 1.0000 - loss: 1.0772e-05 - val_accuracy: 0.5505 - val_loss: 5.5260
Epoch 235/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 5ms/step - accuracy: 1.0000 - loss: 1.0601e-05 - val_accuracy: 0.5505 - val_loss: 5.5298
Epoch 236/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 9.8699e-06 - val_accuracy: 0.5505 - val_loss: 5.5334
Epoch 237/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 9.8145e-06 - val_accuracy: 0.5503 - val_loss: 5.5371
Epoch 238/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.0133e-05 - val_accuracy: 0.5505 - val_loss: 5.5406
Epoch 239/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.0168e-05 - val_accuracy: 0.5503 - val_loss: 5.5444
Epoch 240/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 9.9897e-06 - val_accuracy: 0.5503 - val_loss: 5.5479
Epoch 241/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.0291e-05 - val_accuracy: 0.5503 - val_loss: 5.5514
Epoch 242/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 1.0225e-05 - val_accuracy: 0.5505 - val_loss: 5.5549
Epoch 243/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 9.8761e-06 - val_accuracy: 0.5505 - val_loss: 5.5583
Epoch 244/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 9.8813e-06 - val_accuracy: 0.5507 - val_loss: 5.5617
Epoch 245/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 9.7264e-06 - val_accuracy: 0.5507 - val_loss: 5.5653
Epoch 246/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 9.2280e-06 - val_accuracy: 0.5507 - val_loss: 5.5686
Epoch 247/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 9.2034e-06 - val_accuracy: 0.5505 - val_loss: 5.5720
Epoch 248/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 9.2836e-06 - val_accuracy: 0.5505 - val_loss: 5.5752
Epoch 249/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 7s 5ms/step - accuracy: 1.0000 - loss: 9.4271e-06 - val_accuracy: 0.5505 - val_loss: 5.5785
Epoch 250/250
1389/1389 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 1.0000 - loss: 9.5810e-06 - val_accuracy: 0.5507 - val_loss: 5.5819
313/313 - 1s - 2ms/step - accuracy: 0.5437 - loss: 5.5596
Test accuracy: 0.5436999797821045
In [ ]:
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.axhline(y=test_acc, color='r', linestyle='--', label=f'Test Accuracy: {test_acc:.4f}')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.title('Training and Validation Accuracy over Epochs')
plt.legend()
plt.grid(True)
plt.show()
No description has been provided for this image
In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
from sklearn.model_selection import train_test_split

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

model = models.Sequential([
    layers.Conv2D(256, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(256, (3, 3), activation='relu', padding='same'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(128, (3, 3), activation='relu', padding='same'),
    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dense(128, activation='relu'),
    layers.Dense(64, activation='relu'),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

model.compile(optimizer='sgd',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=150, batch_size=64,
                    validation_data=(val_images, val_labels))

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'Test accuracy: {test_acc}')
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\convolutional\base_conv.py:107: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(activity_regularizer=activity_regularizer, **kwargs)
Epoch 1/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 213ms/step - accuracy: 0.1529 - loss: 2.2909 - val_accuracy: 0.2049 - val_loss: 2.1162
Epoch 2/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 147s 211ms/step - accuracy: 0.2338 - loss: 2.0732 - val_accuracy: 0.2547 - val_loss: 2.0559
Epoch 3/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 212ms/step - accuracy: 0.3175 - loss: 1.8878 - val_accuracy: 0.3784 - val_loss: 1.7186
Epoch 4/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 213ms/step - accuracy: 0.3914 - loss: 1.6989 - val_accuracy: 0.4283 - val_loss: 1.5894
Epoch 5/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 152s 218ms/step - accuracy: 0.4329 - loss: 1.5657 - val_accuracy: 0.4652 - val_loss: 1.4914
Epoch 6/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 215ms/step - accuracy: 0.4649 - loss: 1.4826 - val_accuracy: 0.4767 - val_loss: 1.4150
Epoch 7/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 147s 212ms/step - accuracy: 0.4981 - loss: 1.3985 - val_accuracy: 0.4842 - val_loss: 1.4140
Epoch 8/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 145s 208ms/step - accuracy: 0.5295 - loss: 1.3111 - val_accuracy: 0.5404 - val_loss: 1.2946
Epoch 9/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 145s 208ms/step - accuracy: 0.5601 - loss: 1.2292 - val_accuracy: 0.5512 - val_loss: 1.2667
Epoch 10/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 146s 211ms/step - accuracy: 0.5833 - loss: 1.1665 - val_accuracy: 0.5935 - val_loss: 1.1524
Epoch 11/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 146s 210ms/step - accuracy: 0.6047 - loss: 1.1109 - val_accuracy: 0.6256 - val_loss: 1.0840
Epoch 12/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 145s 208ms/step - accuracy: 0.6248 - loss: 1.0467 - val_accuracy: 0.5257 - val_loss: 1.3076
Epoch 13/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 145s 209ms/step - accuracy: 0.6493 - loss: 0.9862 - val_accuracy: 0.5842 - val_loss: 1.1950
Epoch 14/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 145s 209ms/step - accuracy: 0.6695 - loss: 0.9366 - val_accuracy: 0.6425 - val_loss: 1.0333
Epoch 15/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 145s 209ms/step - accuracy: 0.6937 - loss: 0.8733 - val_accuracy: 0.6385 - val_loss: 1.0369
Epoch 16/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 146s 209ms/step - accuracy: 0.7082 - loss: 0.8292 - val_accuracy: 0.6162 - val_loss: 1.1063
Epoch 17/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 146s 210ms/step - accuracy: 0.7294 - loss: 0.7724 - val_accuracy: 0.6443 - val_loss: 1.0450
Epoch 18/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 145s 209ms/step - accuracy: 0.7465 - loss: 0.7207 - val_accuracy: 0.6749 - val_loss: 0.9534
Epoch 19/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 145s 209ms/step - accuracy: 0.7604 - loss: 0.6780 - val_accuracy: 0.6850 - val_loss: 0.9292
Epoch 20/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 145s 209ms/step - accuracy: 0.7819 - loss: 0.6247 - val_accuracy: 0.7026 - val_loss: 0.8973
Epoch 21/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 0.7965 - loss: 0.5770 - val_accuracy: 0.6992 - val_loss: 0.9112
Epoch 22/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 146s 210ms/step - accuracy: 0.8140 - loss: 0.5369 - val_accuracy: 0.6621 - val_loss: 1.0261
Epoch 23/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 146s 210ms/step - accuracy: 0.8253 - loss: 0.4980 - val_accuracy: 0.7078 - val_loss: 0.8947
Epoch 24/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 146s 210ms/step - accuracy: 0.8488 - loss: 0.4397 - val_accuracy: 0.6884 - val_loss: 0.9690
Epoch 25/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 146s 210ms/step - accuracy: 0.8618 - loss: 0.3996 - val_accuracy: 0.6443 - val_loss: 1.2007
Epoch 26/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 146s 210ms/step - accuracy: 0.8777 - loss: 0.3512 - val_accuracy: 0.6835 - val_loss: 1.0782
Epoch 27/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 146s 210ms/step - accuracy: 0.8953 - loss: 0.3093 - val_accuracy: 0.7237 - val_loss: 0.9582
Epoch 28/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 146s 210ms/step - accuracy: 0.9096 - loss: 0.2636 - val_accuracy: 0.7075 - val_loss: 1.0520
Epoch 29/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 146s 210ms/step - accuracy: 0.9284 - loss: 0.2130 - val_accuracy: 0.6986 - val_loss: 1.1467
Epoch 30/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 0.9382 - loss: 0.1868 - val_accuracy: 0.7030 - val_loss: 1.2158
Epoch 31/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 152s 219ms/step - accuracy: 0.9511 - loss: 0.1496 - val_accuracy: 0.6605 - val_loss: 1.5125
Epoch 32/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 152s 218ms/step - accuracy: 0.9567 - loss: 0.1363 - val_accuracy: 0.7078 - val_loss: 1.3059
Epoch 33/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 0.9666 - loss: 0.1038 - val_accuracy: 0.6959 - val_loss: 1.3778
Epoch 34/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 214ms/step - accuracy: 0.9750 - loss: 0.0813 - val_accuracy: 0.7129 - val_loss: 1.3267
Epoch 35/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 213ms/step - accuracy: 0.9832 - loss: 0.0631 - val_accuracy: 0.7012 - val_loss: 1.5128
Epoch 36/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 147s 211ms/step - accuracy: 0.9903 - loss: 0.0400 - val_accuracy: 0.7105 - val_loss: 1.4599
Epoch 37/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 147s 211ms/step - accuracy: 0.9886 - loss: 0.0431 - val_accuracy: 0.7111 - val_loss: 1.5320
Epoch 38/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 213ms/step - accuracy: 0.9915 - loss: 0.0332 - val_accuracy: 0.7041 - val_loss: 1.5704
Epoch 39/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 147s 211ms/step - accuracy: 0.9912 - loss: 0.0357 - val_accuracy: 0.7186 - val_loss: 1.6742
Epoch 40/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 147s 212ms/step - accuracy: 0.9984 - loss: 0.0106 - val_accuracy: 0.7141 - val_loss: 1.8869
Epoch 41/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 212ms/step - accuracy: 0.9992 - loss: 0.0068 - val_accuracy: 0.7294 - val_loss: 1.7659
Epoch 42/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 212ms/step - accuracy: 1.0000 - loss: 0.0024 - val_accuracy: 0.7294 - val_loss: 1.8203
Epoch 43/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 147s 212ms/step - accuracy: 1.0000 - loss: 0.0016 - val_accuracy: 0.7293 - val_loss: 1.8748
Epoch 44/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 147s 212ms/step - accuracy: 1.0000 - loss: 0.0013 - val_accuracy: 0.7302 - val_loss: 1.9234
Epoch 45/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 147s 212ms/step - accuracy: 1.0000 - loss: 0.0011 - val_accuracy: 0.7285 - val_loss: 1.9438
Epoch 46/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 147s 212ms/step - accuracy: 1.0000 - loss: 8.6068e-04 - val_accuracy: 0.7294 - val_loss: 1.9731
Epoch 47/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 212ms/step - accuracy: 1.0000 - loss: 7.9501e-04 - val_accuracy: 0.7302 - val_loss: 1.9970
Epoch 48/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 213ms/step - accuracy: 1.0000 - loss: 6.8612e-04 - val_accuracy: 0.7280 - val_loss: 2.0166
Epoch 49/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 212ms/step - accuracy: 1.0000 - loss: 6.3592e-04 - val_accuracy: 0.7305 - val_loss: 2.0381
Epoch 50/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 213ms/step - accuracy: 1.0000 - loss: 5.8269e-04 - val_accuracy: 0.7302 - val_loss: 2.0523
Epoch 51/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 214ms/step - accuracy: 1.0000 - loss: 5.4480e-04 - val_accuracy: 0.7293 - val_loss: 2.0756
Epoch 52/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 213ms/step - accuracy: 1.0000 - loss: 5.2392e-04 - val_accuracy: 0.7303 - val_loss: 2.0875
Epoch 53/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 213ms/step - accuracy: 1.0000 - loss: 4.7172e-04 - val_accuracy: 0.7300 - val_loss: 2.1021
Epoch 54/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 214ms/step - accuracy: 1.0000 - loss: 4.4116e-04 - val_accuracy: 0.7293 - val_loss: 2.1169
Epoch 55/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 4.1852e-04 - val_accuracy: 0.7285 - val_loss: 2.1296
Epoch 56/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 214ms/step - accuracy: 1.0000 - loss: 4.0114e-04 - val_accuracy: 0.7296 - val_loss: 2.1414
Epoch 57/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 213ms/step - accuracy: 1.0000 - loss: 3.8346e-04 - val_accuracy: 0.7294 - val_loss: 2.1552
Epoch 58/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 148s 214ms/step - accuracy: 1.0000 - loss: 3.5856e-04 - val_accuracy: 0.7293 - val_loss: 2.1648
Epoch 59/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 214ms/step - accuracy: 1.0000 - loss: 3.3809e-04 - val_accuracy: 0.7303 - val_loss: 2.1762
Epoch 60/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 3.2251e-04 - val_accuracy: 0.7298 - val_loss: 2.1840
Epoch 61/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 214ms/step - accuracy: 1.0000 - loss: 3.1467e-04 - val_accuracy: 0.7293 - val_loss: 2.1942
Epoch 62/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 214ms/step - accuracy: 1.0000 - loss: 3.0370e-04 - val_accuracy: 0.7302 - val_loss: 2.2038
Epoch 63/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 214ms/step - accuracy: 1.0000 - loss: 2.9600e-04 - val_accuracy: 0.7294 - val_loss: 2.2149
Epoch 64/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 214ms/step - accuracy: 1.0000 - loss: 2.7410e-04 - val_accuracy: 0.7300 - val_loss: 2.2233
Epoch 65/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 215ms/step - accuracy: 1.0000 - loss: 2.6988e-04 - val_accuracy: 0.7300 - val_loss: 2.2308
Epoch 66/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 215ms/step - accuracy: 1.0000 - loss: 2.5576e-04 - val_accuracy: 0.7293 - val_loss: 2.2417
Epoch 67/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 215ms/step - accuracy: 1.0000 - loss: 2.4013e-04 - val_accuracy: 0.7303 - val_loss: 2.2487
Epoch 68/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 215ms/step - accuracy: 1.0000 - loss: 2.4072e-04 - val_accuracy: 0.7287 - val_loss: 2.2552
Epoch 69/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 214ms/step - accuracy: 1.0000 - loss: 2.3353e-04 - val_accuracy: 0.7285 - val_loss: 2.2608
Epoch 70/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 215ms/step - accuracy: 1.0000 - loss: 2.2834e-04 - val_accuracy: 0.7307 - val_loss: 2.2740
Epoch 71/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 215ms/step - accuracy: 1.0000 - loss: 2.2156e-04 - val_accuracy: 0.7296 - val_loss: 2.2796
Epoch 72/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 214ms/step - accuracy: 1.0000 - loss: 2.1231e-04 - val_accuracy: 0.7284 - val_loss: 2.2853
Epoch 73/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 152s 218ms/step - accuracy: 1.0000 - loss: 2.0577e-04 - val_accuracy: 0.7291 - val_loss: 2.2926
Epoch 74/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 215ms/step - accuracy: 1.0000 - loss: 2.0056e-04 - val_accuracy: 0.7291 - val_loss: 2.2996
Epoch 75/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 215ms/step - accuracy: 1.0000 - loss: 1.9569e-04 - val_accuracy: 0.7291 - val_loss: 2.3054
Epoch 76/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 215ms/step - accuracy: 1.0000 - loss: 1.9288e-04 - val_accuracy: 0.7302 - val_loss: 2.3138
Epoch 77/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 215ms/step - accuracy: 1.0000 - loss: 1.8392e-04 - val_accuracy: 0.7293 - val_loss: 2.3181
Epoch 78/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 1.8316e-04 - val_accuracy: 0.7291 - val_loss: 2.3260
Epoch 79/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 1.7771e-04 - val_accuracy: 0.7300 - val_loss: 2.3299
Epoch 80/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 215ms/step - accuracy: 1.0000 - loss: 1.7198e-04 - val_accuracy: 0.7294 - val_loss: 2.3357
Epoch 81/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 1.6677e-04 - val_accuracy: 0.7291 - val_loss: 2.3412
Epoch 82/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 149s 215ms/step - accuracy: 1.0000 - loss: 1.6679e-04 - val_accuracy: 0.7291 - val_loss: 2.3493
Epoch 83/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 215ms/step - accuracy: 1.0000 - loss: 1.5874e-04 - val_accuracy: 0.7291 - val_loss: 2.3525
Epoch 84/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 1.5603e-04 - val_accuracy: 0.7291 - val_loss: 2.3584
Epoch 85/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 218ms/step - accuracy: 1.0000 - loss: 1.5137e-04 - val_accuracy: 0.7293 - val_loss: 2.3631
Epoch 86/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 1.5312e-04 - val_accuracy: 0.7293 - val_loss: 2.3703
Epoch 87/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 1.4811e-04 - val_accuracy: 0.7289 - val_loss: 2.3749
Epoch 88/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 215ms/step - accuracy: 1.0000 - loss: 1.4909e-04 - val_accuracy: 0.7291 - val_loss: 2.3793
Epoch 89/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 1.4342e-04 - val_accuracy: 0.7293 - val_loss: 2.3845
Epoch 90/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 1.3593e-04 - val_accuracy: 0.7291 - val_loss: 2.3880
Epoch 91/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 1.3309e-04 - val_accuracy: 0.7291 - val_loss: 2.3934
Epoch 92/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 1.3302e-04 - val_accuracy: 0.7291 - val_loss: 2.3986
Epoch 93/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 1.3011e-04 - val_accuracy: 0.7291 - val_loss: 2.4023
Epoch 94/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 1.2825e-04 - val_accuracy: 0.7289 - val_loss: 2.4094
Epoch 95/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 1.2747e-04 - val_accuracy: 0.7282 - val_loss: 2.4108
Epoch 96/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 1.2362e-04 - val_accuracy: 0.7291 - val_loss: 2.4158
Epoch 97/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 1.2297e-04 - val_accuracy: 0.7293 - val_loss: 2.4204
Epoch 98/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 1.1612e-04 - val_accuracy: 0.7287 - val_loss: 2.4246
Epoch 99/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 1.2015e-04 - val_accuracy: 0.7293 - val_loss: 2.4285
Epoch 100/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 215ms/step - accuracy: 1.0000 - loss: 1.1521e-04 - val_accuracy: 0.7282 - val_loss: 2.4319
Epoch 101/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 1.1093e-04 - val_accuracy: 0.7285 - val_loss: 2.4364
Epoch 102/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 152s 218ms/step - accuracy: 1.0000 - loss: 1.1191e-04 - val_accuracy: 0.7285 - val_loss: 2.4397
Epoch 103/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 153s 220ms/step - accuracy: 1.0000 - loss: 1.0994e-04 - val_accuracy: 0.7293 - val_loss: 2.4448
Epoch 104/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 153s 221ms/step - accuracy: 1.0000 - loss: 1.0857e-04 - val_accuracy: 0.7289 - val_loss: 2.4475
Epoch 105/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 154s 222ms/step - accuracy: 1.0000 - loss: 1.0643e-04 - val_accuracy: 0.7289 - val_loss: 2.4522
Epoch 106/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 153s 220ms/step - accuracy: 1.0000 - loss: 1.0293e-04 - val_accuracy: 0.7293 - val_loss: 2.4560
Epoch 107/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 156s 224ms/step - accuracy: 1.0000 - loss: 1.0100e-04 - val_accuracy: 0.7287 - val_loss: 2.4595
Epoch 108/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 155s 223ms/step - accuracy: 1.0000 - loss: 1.0090e-04 - val_accuracy: 0.7289 - val_loss: 2.4636
Epoch 109/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 156s 225ms/step - accuracy: 1.0000 - loss: 9.8881e-05 - val_accuracy: 0.7289 - val_loss: 2.4671
Epoch 110/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 154s 222ms/step - accuracy: 1.0000 - loss: 1.0021e-04 - val_accuracy: 0.7289 - val_loss: 2.4707
Epoch 111/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 154s 222ms/step - accuracy: 1.0000 - loss: 9.6634e-05 - val_accuracy: 0.7289 - val_loss: 2.4747
Epoch 112/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 154s 222ms/step - accuracy: 1.0000 - loss: 9.7639e-05 - val_accuracy: 0.7287 - val_loss: 2.4775
Epoch 113/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 159s 229ms/step - accuracy: 1.0000 - loss: 9.3657e-05 - val_accuracy: 0.7294 - val_loss: 2.4818
Epoch 114/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 155s 223ms/step - accuracy: 1.0000 - loss: 9.3266e-05 - val_accuracy: 0.7289 - val_loss: 2.4841
Epoch 115/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 9.0806e-05 - val_accuracy: 0.7287 - val_loss: 2.4870
Epoch 116/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 166s 239ms/step - accuracy: 1.0000 - loss: 9.0598e-05 - val_accuracy: 0.7287 - val_loss: 2.4900
Epoch 117/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 160s 230ms/step - accuracy: 1.0000 - loss: 8.9302e-05 - val_accuracy: 0.7294 - val_loss: 2.4942
Epoch 118/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 160s 230ms/step - accuracy: 1.0000 - loss: 8.8993e-05 - val_accuracy: 0.7282 - val_loss: 2.4971
Epoch 119/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 159s 229ms/step - accuracy: 1.0000 - loss: 8.4763e-05 - val_accuracy: 0.7285 - val_loss: 2.5007
Epoch 120/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 160s 230ms/step - accuracy: 1.0000 - loss: 8.6394e-05 - val_accuracy: 0.7285 - val_loss: 2.5049
Epoch 121/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 153s 220ms/step - accuracy: 1.0000 - loss: 8.6057e-05 - val_accuracy: 0.7287 - val_loss: 2.5073
Epoch 122/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 8.4339e-05 - val_accuracy: 0.7284 - val_loss: 2.5097
Epoch 123/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 8.3714e-05 - val_accuracy: 0.7289 - val_loss: 2.5144
Epoch 124/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 154s 221ms/step - accuracy: 1.0000 - loss: 8.1398e-05 - val_accuracy: 0.7285 - val_loss: 2.5159
Epoch 125/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 8.0337e-05 - val_accuracy: 0.7287 - val_loss: 2.5202
Epoch 126/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 7.7960e-05 - val_accuracy: 0.7282 - val_loss: 2.5227
Epoch 127/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 7.8509e-05 - val_accuracy: 0.7282 - val_loss: 2.5245
Epoch 128/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 7.8316e-05 - val_accuracy: 0.7284 - val_loss: 2.5282
Epoch 129/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 7.6893e-05 - val_accuracy: 0.7291 - val_loss: 2.5316
Epoch 130/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 152s 219ms/step - accuracy: 1.0000 - loss: 7.6874e-05 - val_accuracy: 0.7285 - val_loss: 2.5341
Epoch 131/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 152s 218ms/step - accuracy: 1.0000 - loss: 7.3727e-05 - val_accuracy: 0.7291 - val_loss: 2.5366
Epoch 132/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 153s 220ms/step - accuracy: 1.0000 - loss: 7.3063e-05 - val_accuracy: 0.7282 - val_loss: 2.5392
Epoch 133/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 7.4919e-05 - val_accuracy: 0.7284 - val_loss: 2.5432
Epoch 134/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 7.0851e-05 - val_accuracy: 0.7284 - val_loss: 2.5446
Epoch 135/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 7.1533e-05 - val_accuracy: 0.7287 - val_loss: 2.5471
Epoch 136/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 7.0703e-05 - val_accuracy: 0.7285 - val_loss: 2.5505
Epoch 137/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 7.0234e-05 - val_accuracy: 0.7291 - val_loss: 2.5530
Epoch 138/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 218ms/step - accuracy: 1.0000 - loss: 6.9904e-05 - val_accuracy: 0.7285 - val_loss: 2.5565
Epoch 139/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 6.6885e-05 - val_accuracy: 0.7289 - val_loss: 2.5583
Epoch 140/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 6.7599e-05 - val_accuracy: 0.7285 - val_loss: 2.5613
Epoch 141/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 6.7909e-05 - val_accuracy: 0.7287 - val_loss: 2.5635
Epoch 142/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 152s 219ms/step - accuracy: 1.0000 - loss: 6.7638e-05 - val_accuracy: 0.7291 - val_loss: 2.5656
Epoch 143/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 6.5869e-05 - val_accuracy: 0.7293 - val_loss: 2.5678
Epoch 144/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 6.5031e-05 - val_accuracy: 0.7282 - val_loss: 2.5706
Epoch 145/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 6.4927e-05 - val_accuracy: 0.7285 - val_loss: 2.5736
Epoch 146/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 6.3302e-05 - val_accuracy: 0.7285 - val_loss: 2.5760
Epoch 147/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 6.5542e-05 - val_accuracy: 0.7287 - val_loss: 2.5776
Epoch 148/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 150s 216ms/step - accuracy: 1.0000 - loss: 6.1796e-05 - val_accuracy: 0.7287 - val_loss: 2.5805
Epoch 149/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 151s 217ms/step - accuracy: 1.0000 - loss: 6.1350e-05 - val_accuracy: 0.7289 - val_loss: 2.5828
Epoch 150/150
695/695 ━━━━━━━━━━━━━━━━━━━━ 152s 219ms/step - accuracy: 1.0000 - loss: 6.1446e-05 - val_accuracy: 0.7282 - val_loss: 2.5856
313/313 - 11s - 35ms/step - accuracy: 0.7250 - loss: 2.6708
Test accuracy: 0.7250000238418579
In [ ]:
plt.figure(figsize=(10, 6))
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.axhline(y=test_acc, c='r',  linestyle='--', label=f'Test Accuracy of ANN: {test_acc:.4f}')
plt.axhline(y=test_acc1, c='g' ,linestyle='--', label=f'Test Accuracy of CNN: {test_acc1:.4f}')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.title('Training and Validation Accuracy over Epochs')
plt.legend()
plt.grid(True)
plt.show()
No description has been provided for this image

Experiment 2.5: Understand the effect of weight initialization technique on models’ performance.¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models, initializers
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

def create_ann_model(initializer):
    model = models.Sequential([
        layers.Flatten(input_shape=(32, 32, 3)),
        layers.Dense(128, activation='relu', kernel_initializer=initializer),
        layers.Dense(64, activation='relu', kernel_initializer=initializer),
        layers.Dense(10, activation='softmax', kernel_initializer=initializer)
    ])
    model.compile(optimizer='sgd',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    return model

initializers_list = {
    'Zero Initialization': initializers.Zeros(),
    'Random Normal Initialization': initializers.RandomNormal(mean=0.0, stddev=1.0, seed=42),
    'Random Uniform Initialization': initializers.RandomUniform(minval=0.0, maxval=1.0, seed=42),
    'Xavier/Glorot Uniform Initialization': initializers.GlorotUniform(seed=42),
    'He Uniform Initialization': initializers.HeUniform(seed=42),
    'Xavier/Glorot Normal Initialization': initializers.GlorotNormal(seed=42),
    'He Normal Initialization': initializers.HeNormal(seed=42)
}

initializer_names = []
val_accuracies = []
test_accuracies = []

for name, initializer in initializers_list.items():
    model = create_ann_model(initializer)
    history = model.fit(train_images, train_labels, epochs=15, validation_data=(val_images, val_labels), verbose=0)
    val_acc = max(history.history['val_accuracy'])
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)
    initializer_names.append(name)
    val_accuracies.append(val_acc)
    test_accuracies.append(test_acc)
    print(f'{name}, Validation Accuracy: {val_acc}, Test Accuracy: {test_acc}')
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Zero Initialization, Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612
Random Normal Initialization, Validation Accuracy: 0.1004500463604927, Test Accuracy: 0.10010000318288803
Random Uniform Initialization, Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612
Xavier/Glorot Uniform Initialization, Validation Accuracy: 0.49504950642585754, Test Accuracy: 0.4912000000476837
He Uniform Initialization, Validation Accuracy: 0.5013501644134521, Test Accuracy: 0.5005000233650208
Xavier/Glorot Normal Initialization, Validation Accuracy: 0.4982898235321045, Test Accuracy: 0.5023000240325928
He Normal Initialization, Validation Accuracy: 0.48352834582328796, Test Accuracy: 0.46939998865127563
In [ ]:
fig, ax = plt.subplots(2, 1, figsize=(12, 12))

ax[0].bar(initializer_names, val_accuracies, color='green')
ax[0].set_title('Validation Accuracy vs. Weight Initialization Techniques over 15 Epochs')
ax[0].set_xlabel('Weight Initialization Techniques')
ax[0].set_ylabel('Validation Accuracy')
ax[0].set_xticks(range(len(initializer_names)))
ax[0].set_xticklabels(initializer_names, rotation=45)
ax[0].grid(True)

ax[1].bar(initializer_names, test_accuracies, color='lightred')
ax[1].set_title('Test Accuracy vs. Weight Initialization Techniques over 15 Epochs')
ax[1].set_xlabel('Weight Initialization Techniques')
ax[1].set_ylabel('Test Accuracy')
ax[1].set_xticks(range(len(initializer_names)))
ax[1].set_xticklabels(initializer_names, rotation=45)
ax[1].grid(True)

plt.tight_layout()
plt.show()
No description has been provided for this image

Experiment 2.6: Understand the role of Optimization Algorithm and Implement the different Algorithms starting with Batch Gradient Descent, SGD, mini-batch SGD, Momentum, RMS prop and ADAM. Also study the role of Learning rate.¶

Experiment to determine the effect on models performance when using different optimization algorithms at learning rate 0.01¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models, optimizers
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

def create_cnn_model():
    model = models.Sequential([
        layers.Flatten(input_shape=(32, 32, 3)),
        layers.Dense(256, activation='relu'),
        layers.Dense(128, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(10, activation='softmax')
    ])
    return model

def compile_and_train_model(optimizer, epochs=15, batch_size=64):
    model = create_cnn_model()
    model.compile(optimizer=optimizer,
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=batch_size,
                        validation_data=(val_images, val_labels), verbose=0)

    val_acc = max(history.history['val_accuracy'])
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)

    return val_acc, test_acc

optimizers_list = {
    'Batch Gradient Descent': (optimizers.SGD(learning_rate=0.01), len(train_images)),  
    'SGD': (optimizers.SGD(learning_rate=0.01), 1),  
    'Mini-batch SGD': (optimizers.SGD(learning_rate=0.01), 64),  
    'Momentum': (optimizers.SGD(learning_rate=0.01, momentum=0.9), 64),
    'RMSprop': (optimizers.RMSprop(learning_rate=0.01), 64),
    'Adam': (optimizers.Adam(learning_rate=0.01), 64)
}

optimizer_names = []
val_accuracies = []
test_accuracies = []

for name, (optimizer, batch_size) in optimizers_list.items():
    val_acc, test_acc = compile_and_train_model(optimizer, batch_size=batch_size)
    optimizer_names.append(name)
    val_accuracies.append(val_acc)
    test_accuracies.append(test_acc)
    print(f'{name}, Validation Accuracy: {val_acc}, Test Accuracy: {test_acc}')
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Batch Gradient Descent, Validation Accuracy: 0.13447344303131104, Test Accuracy: 0.13609999418258667
SGD, Validation Accuracy: 0.4063006341457367, Test Accuracy: 0.4041999876499176
Mini-batch SGD, Validation Accuracy: 0.4660665988922119, Test Accuracy: 0.39980000257492065
Momentum, Validation Accuracy: 0.49774977564811707, Test Accuracy: 0.49230000376701355
RMSprop, Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612
Adam, Validation Accuracy: 0.3670566976070404, Test Accuracy: 0.3361999988555908
In [ ]:
fig, ax = plt.subplots(2, 1, figsize=(12, 12))

ax[0].bar(optimizer_names, val_accuracies, color='red')
ax[0].set_title('Validation Accuracy vs. Optimization Algorithms over 15 Epochs at learning rate 0.01')
ax[0].set_xlabel('Optimization Algorithms')
ax[0].set_ylabel('Validation Accuracy')
ax[0].set_xticks(range(len(optimizer_names)))
ax[0].set_xticklabels(optimizer_names, rotation=45)
ax[0].grid(True)

ax[1].bar(optimizer_names, test_accuracies, color='pink')
ax[1].set_title('Test Accuracy vs. Optimization Algorithms over 15 Epochs at learning rate 0.01')
ax[1].set_xlabel('Optimization Algorithms')
ax[1].set_ylabel('Test Accuracy')
ax[1].set_xticks(range(len(optimizer_names)))
ax[1].set_xticklabels(optimizer_names, rotation=45)
ax[1].grid(True)

plt.tight_layout()
plt.show()
No description has been provided for this image

Experiment to determine the effect on models performance when using different optimization algorithms at learning rate 0.001¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models, optimizers
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

def create_cnn_model():
    model = models.Sequential([
        layers.Flatten(input_shape=(32, 32, 3)),
        layers.Dense(256, activation='relu'),
        layers.Dense(128, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(10, activation='softmax')
    ])
    return model

def compile_and_train_model(optimizer, epochs=20, batch_size=64):
    model = create_cnn_model()
    model.compile(optimizer=optimizer,
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=batch_size,
                        validation_data=(val_images, val_labels), verbose=0)

    val_acc = max(history.history['val_accuracy'])
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)

    return val_acc, test_acc

optimizers_list = {
    'Batch Gradient Descent': (optimizers.SGD(learning_rate=0.001), len(train_images)),
    'SGD': (optimizers.SGD(learning_rate=0.001), 1),
    'Mini-batch SGD': (optimizers.SGD(learning_rate=0.001), 64),
    'Momentum': (optimizers.SGD(learning_rate=0.001, momentum=0.9), 64),
    'RMSprop': (optimizers.RMSprop(learning_rate=0.001), 64),
    'Adam': (optimizers.Adam(learning_rate=0.001), 64)
}

optimizer_names = []
val_accuracies = []
test_accuracies = []

for name, (optimizer, batch_size) in optimizers_list.items():
    val_acc, test_acc = compile_and_train_model(optimizer, batch_size=batch_size)
    optimizer_names.append(name)
    val_accuracies.append(val_acc)
    test_accuracies.append(test_acc)
    print(f'{name}, Validation Accuracy: {val_acc}, Test Accuracy: {test_acc}')

fig, ax = plt.subplots(2, 1, figsize=(12, 12))

ax[0].bar(optimizer_names, val_accuracies, color='skyblue')
ax[0].set_title('Validation Accuracy vs. Optimization Algorithms')
ax[0].set_xlabel('Optimization Algorithms')
ax[0].set_ylabel('Validation Accuracy')
ax[0].set_xticks(range(len(optimizer_names)))
ax[0].set_xticklabels(optimizer_names, rotation=45)
ax[0].grid(True)

ax[1].bar(optimizer_names, test_accuracies, color='lightgreen')
ax[1].set_title('Test Accuracy vs. Optimization Algorithms')
ax[1].set_xlabel('Optimization Algorithms')
ax[1].set_ylabel('Test Accuracy')
ax[1].set_xticks(range(len(optimizer_names)))
ax[1].set_xticklabels(optimizer_names, rotation=45)
ax[1].grid(True)

plt.tight_layout()
plt.show()
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Batch Gradient Descent, Validation Accuracy: 0.09666966646909714, Test Accuracy: 0.09070000052452087
SGD, Validation Accuracy: 0.521692156791687, Test Accuracy: 0.5120999813079834
Mini-batch SGD, Validation Accuracy: 0.4185418486595154, Test Accuracy: 0.4226999878883362
Momentum, Validation Accuracy: 0.502970278263092, Test Accuracy: 0.4999000132083893
RMSprop, Validation Accuracy: 0.4775877594947815, Test Accuracy: 0.4740999937057495
Adam, Validation Accuracy: 0.49558955430984497, Test Accuracy: 0.49720001220703125
No description has been provided for this image

Experiment to determine the effect on models performance when using different optimization algorithms at learning rate 0.1¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models, optimizers
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

def create_cnn_model():
    model = models.Sequential([
        layers.Flatten(input_shape=(32, 32, 3)),
        layers.Dense(256, activation='relu'),
        layers.Dense(128, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(10, activation='softmax')
    ])
    return model

def compile_and_train_model(optimizer, epochs=10, batch_size=64):
    model = create_cnn_model()
    model.compile(optimizer=optimizer,
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=batch_size,
                        validation_data=(val_images, val_labels), verbose=0)

    val_acc = max(history.history['val_accuracy'])
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)

    return val_acc, test_acc

l = 0.1  

optimizers_list = {
    'Batch Gradient Descent': (optimizers.SGD(learning_rate=l), len(train_images)),  
    'SGD': (optimizers.SGD(learning_rate=l), 1),  
    'Mini-batch SGD': (optimizers.SGD(learning_rate=l), 64),  
    'Momentum': (optimizers.SGD(learning_rate=l, momentum=0.9), 64),
    'RMSprop': (optimizers.RMSprop(learning_rate=l), 64),
    'Adam': (optimizers.Adam(learning_rate=l), 64)
}

optimizer_names = []
val_accuracies = []
test_accuracies = []

for name, (optimizer, batch_size) in optimizers_list.items():
    val_acc, test_acc = compile_and_train_model(optimizer, batch_size=batch_size)
    optimizer_names.append(name)
    val_accuracies.append(val_acc)
    test_accuracies.append(test_acc)
    print(f'{name}, Validation Accuracy: {val_acc}, Test Accuracy: {test_acc}')

fig, ax = plt.subplots(2, 1, figsize=(12, 12))

ax[0].bar(optimizer_names, val_accuracies, color='skyblue')
ax[0].set_title('Validation Accuracy vs. Optimization Algorithms')
ax[0].set_xlabel('Optimization Algorithms')
ax[0].set_ylabel('Validation Accuracy')
ax[0].set_xticks(range(len(optimizer_names)))
ax[0].set_xticklabels(optimizer_names, rotation=45)
ax[0].grid(True)

ax[1].bar(optimizer_names, test_accuracies, color='lightgreen')
ax[1].set_title('Test Accuracy vs. Optimization Algorithms')
ax[1].set_xlabel('Optimization Algorithms')
ax[1].set_ylabel('Test Accuracy')
ax[1].set_xticks(range(len(optimizer_names)))
ax[1].set_xticklabels(optimizer_names, rotation=45)
ax[1].grid(True)

plt.tight_layout()
plt.show()
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Batch Gradient Descent, Validation Accuracy: 0.17137713730335236, Test Accuracy: 0.17090000212192535
SGD, Validation Accuracy: 0.09990999102592468, Test Accuracy: 0.10000000149011612
Mini-batch SGD, Validation Accuracy: 0.4498649835586548, Test Accuracy: 0.4339999854564667
Momentum, Validation Accuracy: 0.16651664674282074, Test Accuracy: 0.10000000149011612
RMSprop, Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612
Adam, Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612
No description has been provided for this image

Experiment to determine the effect on models performance when using different optimization algorithms at learning rate 0.05¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models, optimizers
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

def create_cnn_model():
    model = models.Sequential([
        layers.Flatten(input_shape=(32, 32, 3)),
        layers.Dense(256, activation='relu'),
        layers.Dense(128, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(10, activation='softmax')
    ])
    return model

def compile_and_train_model(optimizer, epochs=10, batch_size=64):
    model = create_cnn_model()
    model.compile(optimizer=optimizer,
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=batch_size,
                        validation_data=(val_images, val_labels), verbose=0)

    val_acc = max(history.history['val_accuracy'])
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)

    return val_acc, test_acc

l = 0.05

optimizers_list = {
    'Batch Gradient Descent': (optimizers.SGD(learning_rate=l), len(train_images)),
    'SGD': (optimizers.SGD(learning_rate=l), 1),
    'Mini-batch SGD': (optimizers.SGD(learning_rate=l), 64),
    'Momentum': (optimizers.SGD(learning_rate=l, momentum=0.9), 64),
    'RMSprop': (optimizers.RMSprop(learning_rate=l), 64),
    'Adam': (optimizers.Adam(learning_rate=l), 64)
}

optimizer_names = []
val_accuracies = []
test_accuracies = []

for name, (optimizer, batch_size) in optimizers_list.items():
    val_acc, test_acc = compile_and_train_model(optimizer, batch_size=batch_size)
    optimizer_names.append(name)
    val_accuracies.append(val_acc)
    test_accuracies.append(test_acc)
    print(f'{name}, Validation Accuracy: {val_acc}, Test Accuracy: {test_acc}')

fig, ax = plt.subplots(2, 1, figsize=(12, 12))

ax[0].bar(optimizer_names, val_accuracies, color='skyblue')
ax[0].set_title('Validation Accuracy vs. Optimization Algorithms')
ax[0].set_xlabel('Optimization Algorithms')
ax[0].set_ylabel('Validation Accuracy')
ax[0].set_xticks(range(len(optimizer_names)))
ax[0].set_xticklabels(optimizer_names, rotation=45)
ax[0].grid(True)

ax[1].bar(optimizer_names, test_accuracies, color='lightgreen')
ax[1].set_title('Test Accuracy vs. Optimization Algorithms')
ax[1].set_xlabel('Optimization Algorithms')
ax[1].set_ylabel('Test Accuracy')
ax[1].set_xticks(range(len(optimizer_names)))
ax[1].set_xticklabels(optimizer_names, rotation=45)
ax[1].grid(True)

plt.tight_layout()
plt.show()
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Batch Gradient Descent, Validation Accuracy: 0.17875787615776062, Test Accuracy: 0.1776999980211258
SGD, Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612
Mini-batch SGD, Validation Accuracy: 0.48280829191207886, Test Accuracy: 0.47620001435279846
Momentum, Validation Accuracy: 0.38793879747390747, Test Accuracy: 0.3804999887943268
RMSprop, Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612
Adam, Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612
No description has been provided for this image

Experiment to determine the effect on models performance when using different optimization algorithms at learning rate 0.009¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models, optimizers
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

def create_cnn_model():
    model = models.Sequential([
        layers.Flatten(input_shape=(32, 32, 3)),
        layers.Dense(256, activation='relu'),
        layers.Dense(128, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(10, activation='softmax')
    ])
    return model

def compile_and_train_model(optimizer, epochs=10, batch_size=64):
    model = create_cnn_model()
    model.compile(optimizer=optimizer,
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=batch_size,
                        validation_data=(val_images, val_labels), verbose=0)

    val_acc = max(history.history['val_accuracy'])
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)

    return val_acc, test_acc

l = 0.009

optimizers_list = {
    'Batch Gradient Descent': (optimizers.SGD(learning_rate=l), len(train_images)),
    'SGD': (optimizers.SGD(learning_rate=l), 1),
    'Mini-batch SGD': (optimizers.SGD(learning_rate=l), 64),
    'Momentum': (optimizers.SGD(learning_rate=l, momentum=0.9), 64),
    'RMSprop': (optimizers.RMSprop(learning_rate=l), 64),
    'Adam': (optimizers.Adam(learning_rate=l), 64)
}

optimizer_names = []
val_accuracies = []
test_accuracies = []

for name, (optimizer, batch_size) in optimizers_list.items():
    val_acc, test_acc = compile_and_train_model(optimizer, batch_size=batch_size)
    optimizer_names.append(name)
    val_accuracies.append(val_acc)
    test_accuracies.append(test_acc)
    print(f'{name}, Validation Accuracy: {val_acc}, Test Accuracy: {test_acc}')

fig, ax = plt.subplots(2, 1, figsize=(12, 12))

ax[0].bar(optimizer_names, val_accuracies, color='skyblue')
ax[0].set_title('Validation Accuracy vs. Optimization Algorithms')
ax[0].set_xlabel('Optimization Algorithms')
ax[0].set_ylabel('Validation Accuracy')
ax[0].set_xticks(range(len(optimizer_names)))
ax[0].set_xticklabels(optimizer_names, rotation=45)
ax[0].grid(True)

ax[1].bar(optimizer_names, test_accuracies, color='lightgreen')
ax[1].set_title('Test Accuracy vs. Optimization Algorithms')
ax[1].set_xlabel('Optimization Algorithms')
ax[1].set_ylabel('Test Accuracy')
ax[1].set_xticks(range(len(optimizer_names)))
ax[1].set_xticklabels(optimizer_names, rotation=45)
ax[1].grid(True)

plt.tight_layout()
plt.show()
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Batch Gradient Descent, Validation Accuracy: 0.13447344303131104, Test Accuracy: 0.12929999828338623
SGD, Validation Accuracy: 0.41080108284950256, Test Accuracy: 0.4004000127315521
Mini-batch SGD, Validation Accuracy: 0.44950494170188904, Test Accuracy: 0.4526999890804291
Momentum, Validation Accuracy: 0.47146713733673096, Test Accuracy: 0.4758000075817108
RMSprop, Validation Accuracy: 0.2145814597606659, Test Accuracy: 0.20360000431537628
Adam, Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612
No description has been provided for this image

Experiment to determine models training time when using different optimization algorithms at learning rate 0.009 for just one Epoch.¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models, optimizers
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import time

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

def create_cnn_model():
    model = models.Sequential([
        layers.Flatten(input_shape=(32, 32, 3)),
        layers.Dense(256, activation='relu'),
        layers.Dense(128, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(10, activation='softmax')
    ])
    return model

def compile_and_train_model(optimizer, epochs=1, batch_size=64):
    model = create_cnn_model()
    model.compile(optimizer=optimizer,
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    start_time = time.time()
    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=batch_size,
                        validation_data=(val_images, val_labels), verbose=0)
    end_time = time.time()
    
    val_acc = max(history.history['val_accuracy'])
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)
    training_time = end_time - start_time

    return val_acc, test_acc, training_time

learning_rate = 0.009
optimizers_list = {
    'Batch Gradient Descent': (optimizers.SGD(learning_rate=learning_rate), len(train_images)),
    'SGD': (optimizers.SGD(learning_rate=learning_rate), 1),
    'Mini-batch SGD': (optimizers.SGD(learning_rate=learning_rate), 64),
    'Momentum': (optimizers.SGD(learning_rate=learning_rate, momentum=0.9), 64),
    'RMSprop': (optimizers.RMSprop(learning_rate=learning_rate), 64),
    'Adam': (optimizers.Adam(learning_rate=learning_rate), 64)
}

optimizer_names = []
training_times = []

for name, (optimizer, batch_size) in optimizers_list.items():
    val_acc, test_acc, training_time = compile_and_train_model(optimizer, batch_size=batch_size)
    optimizer_names.append(name)
    training_times.append(training_time)
    print(f'{name}, Training Time: {training_time:.2f} seconds')
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Batch Gradient Descent, Training Time: 4.20 seconds
SGD, Training Time: 91.31 seconds
Mini-batch SGD, Training Time: 3.83 seconds
Momentum, Training Time: 4.76 seconds
RMSprop, Training Time: 5.48 seconds
Adam, Training Time: 6.73 seconds
In [ ]:
fig, ax = plt.subplots(figsize=(12, 6))
ax.bar(optimizer_names, training_times, color='yellow')
ax.set_title('Training Time vs. Optimization Algorithms for One Epoch')
ax.set_xlabel('Optimization Algorithms')
ax.set_ylabel('Training Time (seconds)')
ax.set_xticks(range(len(optimizer_names)))
ax.set_xticklabels(optimizer_names, rotation=45)
ax.grid(True)

plt.tight_layout()
plt.show()
No description has been provided for this image

Experiment to determine models training time when using different optimization algorithms at learning rate 0.009 for 10 Epoch.¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models, optimizers
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import time

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

def create_cnn_model():
    model = models.Sequential([
        layers.Flatten(input_shape=(32, 32, 3)),
        layers.Dense(256, activation='relu'),
        layers.Dense(128, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(10, activation='softmax')
    ])
    return model

def compile_and_train_model(optimizer, epochs=10, batch_size=64):
    model = create_cnn_model()
    model.compile(optimizer=optimizer,
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    start_time = time.time()
    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=batch_size,
                        validation_data=(val_images, val_labels), verbose=0)
    end_time = time.time()
    
    val_acc = max(history.history['val_accuracy'])
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)
    training_time = end_time - start_time

    return val_acc, test_acc, training_time

learning_rate = 0.009
optimizers_list = {
    'Batch Gradient Descent': (optimizers.SGD(learning_rate=learning_rate), len(train_images)),
    'SGD': (optimizers.SGD(learning_rate=learning_rate), 1),
    'Mini-batch SGD': (optimizers.SGD(learning_rate=learning_rate), 64),
    'Momentum': (optimizers.SGD(learning_rate=learning_rate, momentum=0.9), 64),
    'RMSprop': (optimizers.RMSprop(learning_rate=learning_rate), 64),
    'Adam': (optimizers.Adam(learning_rate=learning_rate), 64)
}

optimizer_names = []
training_times = []

for name, (optimizer, batch_size) in optimizers_list.items():
    val_acc, test_acc, training_time = compile_and_train_model(optimizer, batch_size=batch_size)
    optimizer_names.append(name)
    training_times.append(training_time)
    print(f'{name}, Training Time: {training_time:.2f} seconds')
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
<keras.src.optimizers.sgd.SGD object at 0x000002935DC3CB20> 44445
Batch Gradient Descent, Training Time: 9.00 seconds
<keras.src.optimizers.sgd.SGD object at 0x000002936A22DB40> 1
SGD, Training Time: 882.84 seconds
<keras.src.optimizers.sgd.SGD object at 0x000002936A22DDE0> 64
Mini-batch SGD, Training Time: 24.40 seconds
<keras.src.optimizers.sgd.SGD object at 0x000002936CD6AE00> 64
Momentum, Training Time: 27.49 seconds
<keras.src.optimizers.rmsprop.RMSprop object at 0x000002936D0D2FE0> 64
RMSprop, Training Time: 35.89 seconds
<keras.src.optimizers.adam.Adam object at 0x000002936D16FFA0> 64
Adam, Training Time: 43.13 seconds
In [ ]:
# Plot the results
fig, ax = plt.subplots(figsize=(12, 6))

# Plotting the bar graph on the single axis
ax.bar(optimizer_names, training_times, color='lightcoral')
ax.set_title('Training Time vs. Optimization Algorithms for 10 Epoch')
ax.set_xlabel('Optimization Algorithms')
ax.set_ylabel('Training Time (seconds)')
ax.set_xticks(range(len(optimizer_names)))
ax.set_xticklabels(optimizer_names, rotation=45)
ax.grid(True)

plt.tight_layout()
plt.show()
No description has been provided for this image

Experiment to determine models performance, training time when using different optimization algorithms like SGD, Momentum, RMSprop, Adam at learning rates [0.001, 0.003, 0.006, 0.01, 0.03, 0.06, 0.1, 0.3, 0.6] for 25 Epoch.¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models, optimizers
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import time

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images, val_images, train_labels, val_labels = train_test_split(
    train_images, train_labels, test_size=0.1111, random_state=42, stratify=train_labels)

def create_cnn_model():
    model = models.Sequential([
        layers.Flatten(input_shape=(32, 32, 3)),
        layers.Dense(256, activation='relu'),
        layers.Dense(128, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(10, activation='softmax')
    ])
    return model

def compile_and_train_model(optimizer, epochs=1, batch_size=64):
    model = create_cnn_model()
    model.compile(optimizer=optimizer,
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    
    start_time = time.time()
    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=batch_size,
                        validation_data=(val_images, val_labels), verbose=0)
    training_time = time.time() - start_time

    val_acc = max(history.history['val_accuracy'])
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)

    return val_acc, test_acc, training_time, history

learning_rates = [0.001, 0.003, 0.006, 0.01, 0.03, 0.06,  0.1, 0.3, 0.6]
optimizers_list = {
    'SGD': [(optimizers.SGD(learning_rate=lr), lr) for lr in learning_rates],
    'Momentum': [(optimizers.SGD(learning_rate=lr, momentum=0.9), lr) for lr in learning_rates],
    'RMSprop': [(optimizers.RMSprop(learning_rate=lr), lr) for lr in learning_rates],
    'Adam': [(optimizers.Adam(learning_rate=lr), lr) for lr in learning_rates]
}

optimizer_names = []
val_accuracies = []
test_accuracies = []
training_times = []
histories = []

for name, optimizer_lr_list in optimizers_list.items():
    for optimizer, lr in optimizer_lr_list:
        val_acc, test_acc, training_time, history = compile_and_train_model(optimizer, epochs=25, batch_size=64)
        optimizer_names.append(f'{name} (lr={lr})')
        val_accuracies.append(val_acc)
        test_accuracies.append(test_acc)
        training_times.append(training_time)
        histories.append(history)
        print(f'{name} (lr={lr}), Validation Accuracy: {val_acc}, Test Accuracy: {test_acc}, Training Time: {training_time}')

fig, ax = plt.subplots(3, 1, figsize=(12, 18))

ax[0].bar(optimizer_names, val_accuracies, color='skyblue')
ax[0].set_title('Validation Accuracy vs. Optimization Algorithms and Learning Rates')
ax[0].set_xlabel('Optimization Algorithms and Learning Rates')
ax[0].set_ylabel('Validation Accuracy')
ax[0].set_xticks(range(len(optimizer_names)))
ax[0].set_xticklabels(optimizer_names, rotation=45)
ax[0].grid(True)

ax[1].bar(optimizer_names, test_accuracies, color='lightgreen')
ax[1].set_title('Test Accuracy vs. Optimization Algorithms and Learning Rates')
ax[1].set_xlabel('Optimization Algorithms and Learning Rates')
ax[1].set_ylabel('Test Accuracy')
ax[1].set_xticks(range(len(optimizer_names)))
ax[1].set_xticklabels(optimizer_names, rotation=45)
ax[1].grid(True)

ax[2].bar(optimizer_names, training_times, color='lightcoral')
ax[2].set_title('Training Time vs. Optimization Algorithms and Learning Rates')
ax[2].set_xlabel('Optimization Algorithms and Learning Rates')
ax[2].set_ylabel('Training Time (seconds)')
ax[2].set_xticks(range(len(optimizer_names)))
ax[2].set_xticklabels(optimizer_names, rotation=45)
ax[2].grid(True)

plt.tight_layout()
plt.show()

fig, ax = plt.subplots(figsize=(12, 8))

for name, history in zip(optimizer_names, histories):
    ax.plot(history.history['val_accuracy'], label=name)

ax.set_title('Validation Accuracy over Epochs')
ax.set_xlabel('Epoch')
ax.set_ylabel('Validation Accuracy')
ax.legend()
ax.grid(True)

plt.show()
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
SGD (lr=0.001), Validation Accuracy: 0.41170117259025574, Test Accuracy: 0.414900004863739, Training Time: 59.90916466712952
SGD (lr=0.003), Validation Accuracy: 0.46570655703544617, Test Accuracy: 0.4523000121116638, Training Time: 60.17952847480774
SGD (lr=0.006), Validation Accuracy: 0.507830798625946, Test Accuracy: 0.5127999782562256, Training Time: 60.077714681625366
SGD (lr=0.01), Validation Accuracy: 0.4959495961666107, Test Accuracy: 0.4984999895095825, Training Time: 59.67248606681824
SGD (lr=0.03), Validation Accuracy: 0.507830798625946, Test Accuracy: 0.41019999980926514, Training Time: 59.59853005409241
SGD (lr=0.06), Validation Accuracy: 0.4934293329715729, Test Accuracy: 0.5080000162124634, Training Time: 60.43995141983032
SGD (lr=0.1), Validation Accuracy: 0.49432942271232605, Test Accuracy: 0.503600001335144, Training Time: 60.526172399520874
SGD (lr=0.3), Validation Accuracy: 0.4498649835586548, Test Accuracy: 0.435699999332428, Training Time: 60.75846862792969
SGD (lr=0.6), Validation Accuracy: 0.09990999102592468, Test Accuracy: 0.10000000149011612, Training Time: 60.53550148010254
Momentum (lr=0.001), Validation Accuracy: 0.5067507028579712, Test Accuracy: 0.49900001287460327, Training Time: 67.16620874404907
Momentum (lr=0.003), Validation Accuracy: 0.5202520489692688, Test Accuracy: 0.5138000249862671, Training Time: 66.87788820266724
Momentum (lr=0.006), Validation Accuracy: 0.5117911696434021, Test Accuracy: 0.5076000094413757, Training Time: 66.39665341377258
Momentum (lr=0.01), Validation Accuracy: 0.5031503438949585, Test Accuracy: 0.5073000192642212, Training Time: 66.67020010948181
Momentum (lr=0.03), Validation Accuracy: 0.4617461860179901, Test Accuracy: 0.46140000224113464, Training Time: 66.64304995536804
Momentum (lr=0.06), Validation Accuracy: 0.3463546335697174, Test Accuracy: 0.29420000314712524, Training Time: 66.45746040344238
Momentum (lr=0.1), Validation Accuracy: 0.19441944360733032, Test Accuracy: 0.10000000149011612, Training Time: 66.6251471042633
Momentum (lr=0.3), Validation Accuracy: 0.09990999102592468, Test Accuracy: 0.10000000149011612, Training Time: 69.95335173606873
Momentum (lr=0.6), Validation Accuracy: 0.09990999102592468, Test Accuracy: 0.10000000149011612, Training Time: 66.88169050216675
RMSprop (lr=0.001), Validation Accuracy: 0.4901890158653259, Test Accuracy: 0.4869000017642975, Training Time: 92.40610194206238
RMSprop (lr=0.003), Validation Accuracy: 0.4212421178817749, Test Accuracy: 0.39969998598098755, Training Time: 89.84469389915466
RMSprop (lr=0.006), Validation Accuracy: 0.3463546335697174, Test Accuracy: 0.28209999203681946, Training Time: 90.36036109924316
RMSprop (lr=0.01), Validation Accuracy: 0.2653465270996094, Test Accuracy: 0.259799987077713, Training Time: 88.80380821228027
RMSprop (lr=0.03), Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612, Training Time: 88.7582426071167
RMSprop (lr=0.06), Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612, Training Time: 88.59473609924316
RMSprop (lr=0.1), Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612, Training Time: 88.38554430007935
RMSprop (lr=0.3), Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612, Training Time: 88.68279957771301
RMSprop (lr=0.6), Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612, Training Time: 89.25238418579102
Adam (lr=0.001), Validation Accuracy: 0.5000900030136108, Test Accuracy: 0.49869999289512634, Training Time: 106.54631996154785
Adam (lr=0.003), Validation Accuracy: 0.471647173166275, Test Accuracy: 0.4731000065803528, Training Time: 107.21505951881409
Adam (lr=0.006), Validation Accuracy: 0.41728171706199646, Test Accuracy: 0.39149999618530273, Training Time: 106.76777815818787
Adam (lr=0.01), Validation Accuracy: 0.392619252204895, Test Accuracy: 0.3531999886035919, Training Time: 105.85737895965576
Adam (lr=0.03), Validation Accuracy: 0.2018001824617386, Test Accuracy: 0.10000000149011612, Training Time: 105.79345917701721
Adam (lr=0.06), Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612, Training Time: 105.20845293998718
Adam (lr=0.1), Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612, Training Time: 106.4516031742096
Adam (lr=0.3), Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612, Training Time: 106.20232963562012
Adam (lr=0.6), Validation Accuracy: 0.10009001195430756, Test Accuracy: 0.10000000149011612, Training Time: 105.8603503704071
No description has been provided for this image
No description has been provided for this image

Experiment 2.7: Analize the optimal splitting of data into training, validation, and testing datasets.¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models, optimizers
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

def create_cnn_model():
    model = models.Sequential([
        layers.Flatten(input_shape=(32, 32, 3)),
        layers.Dense(256, activation='relu'),
        layers.Dense(128, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(64, activation='relu'),
        layers.Dense(10, activation='softmax')
    ])
    return model

def compile_and_train_model(train_images, train_labels, val_images, val_labels, test_images, test_labels, optimizer, epochs=20, batch_size=64):
    model = create_cnn_model()
    model.compile(optimizer=optimizer,
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=batch_size,
                        validation_data=(val_images, val_labels), verbose=0)

    val_acc = max(history.history['val_accuracy'])
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)

    return val_acc, test_acc

split_ratios = [
    (0.70, 0.15, 0.15),
    (0.80, 0.10, 0.10),
    (0.90, 0.05, 0.05),
    (0.60, 0.20, 0.20),
    (0.50, 0.25, 0.25),
    (0.40, 0.30, 0.30),
    (0.75, 0.15, 0.10),
    (0.85, 0.10, 0.05),
    (0.65, 0.20, 0.15)
]

split_names = []
val_accuracies = []
test_accuracies = []

for train_ratio, val_ratio, test_ratio in split_ratios:
    total_size = len(train_images) + len(test_images)
    train_size = int(total_size * train_ratio)
    val_size = int(total_size * val_ratio)
    test_size = total_size - train_size - val_size

    combined_images = np.concatenate((train_images, test_images))
    combined_labels = np.concatenate((train_labels, test_labels))

    train_images_split, temp_images, train_labels_split, temp_labels = train_test_split(
        combined_images, combined_labels, train_size=train_size, random_state=42, stratify=combined_labels)
    val_images_split, test_images_split, val_labels_split, test_labels_split = train_test_split(
        temp_images, temp_labels, test_size=test_size, random_state=42, stratify=temp_labels)

    optimizer = optimizers.SGD(learning_rate=0.001, momentum=0.9)
    
    val_acc, test_acc = compile_and_train_model(train_images_split, train_labels_split, val_images_split, val_labels_split, test_images_split, test_labels_split,
                                                optimizer=optimizer, epochs=50, batch_size=64)
    
    split_names.append(f'{int(train_ratio*100)}/{int(val_ratio*100)}/{int(test_ratio*100)}')
    val_accuracies.append(val_acc)
    test_accuracies.append(test_acc)
    print(f'Split {int(train_ratio*100)}/{int(val_ratio*100)}/{int(test_ratio*100)}, Validation Accuracy: {val_acc:.4f}, Test Accuracy: {test_acc:.4f}')

plt.figure(figsize=(10, 6))

plt.plot(split_names, val_accuracies, marker='o', linestyle='-', color='b', label='Validation Accuracy')
plt.plot(split_names, test_accuracies, marker='o', linestyle='-', color='g', label='Test Accuracy')

plt.title('Validation and Test Accuracy vs. Data Splits')
plt.xlabel('Data Splits (Train/Val/Test)')
plt.ylabel('Accuracy')
plt.xticks(rotation=45)
plt.legend()
plt.grid(True)
plt.tight_layout()

plt.show()
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Split 70/15/15, Validation Accuracy: 0.5310, Test Accuracy: 0.5232
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Split 80/10/10, Validation Accuracy: 0.5380, Test Accuracy: 0.5185
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Split 90/5/5, Validation Accuracy: 0.5433, Test Accuracy: 0.5303
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Split 60/20/20, Validation Accuracy: 0.5204, Test Accuracy: 0.5015
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Split 50/25/25, Validation Accuracy: 0.5134, Test Accuracy: 0.4991
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Split 40/30/30, Validation Accuracy: 0.5066, Test Accuracy: 0.4849
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Split 75/15/10, Validation Accuracy: 0.5328, Test Accuracy: 0.5283
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Split 85/10/5, Validation Accuracy: 0.5408, Test Accuracy: 0.5347
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\reshaping\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Split 65/20/15, Validation Accuracy: 0.5247, Test Accuracy: 0.5190
No description has been provided for this image

Experiment 2.8: Understand the role of Regularization techniques and Implement L1, L2, Dropout, Early stopping and batch normalizationtechniques and study the effect of these techniques on models’ performance¶

In [ ]:
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models, optimizers, regularizers, callbacks
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
train_labels = train_labels.flatten()
test_labels = test_labels.flatten()

train_images, test_images = train_images / 255.0, test_images / 255.0

def create_cnn_model(regularization=None, dropout_rate=0.0, batch_norm=False):
    model = models.Sequential()
    
    model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3),
                            kernel_regularizer=regularization))
    if batch_norm:
        model.add(layers.BatchNormalization())
    model.add(layers.MaxPooling2D((2, 2)))
    
    model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same', kernel_regularizer=regularization))
    if batch_norm:
        model.add(layers.BatchNormalization())
    model.add(layers.MaxPooling2D((2, 2)))
    
    model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same', kernel_regularizer=regularization))
    if batch_norm:
        model.add(layers.BatchNormalization())
    
    model.add(layers.Flatten())
    
    model.add(layers.Dense(128, activation='relu', kernel_regularizer=regularization))
    if batch_norm:
        model.add(layers.BatchNormalization())
    model.add(layers.Dropout(dropout_rate))
    
    model.add(layers.Dense(128, activation='relu', kernel_regularizer=regularization))
    if batch_norm:
        model.add(layers.BatchNormalization())
    model.add(layers.Dropout(dropout_rate))
    
    model.add(layers.Dense(64, activation='relu', kernel_regularizer=regularization))
    if batch_norm:
        model.add(layers.BatchNormalization())
    model.add(layers.Dropout(dropout_rate))
    
    model.add(layers.Dense(64, activation='relu', kernel_regularizer=regularization))
    if batch_norm:
        model.add(layers.BatchNormalization())
    model.add(layers.Dropout(dropout_rate))
    
    model.add(layers.Dense(10, activation='softmax'))
    
    return model

def compile_and_train_model(model, optimizer, epochs=20, batch_size=64, use_early_stopping=False):
    model.compile(optimizer=optimizer,
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    if use_early_stopping:
        early_stopping = callbacks.EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)
        callback_list = [early_stopping]
    else:
        callback_list = []
    
    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=batch_size,
                        validation_data=(val_images, val_labels), callbacks=callback_list, verbose=0)

    val_acc = max(history.history['val_accuracy'])
    train_acc = max(history.history['accuracy'])
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)
    
    return train_acc, val_acc, test_acc, history.history['accuracy']

techniques = [ 'L1', 'L2', 'Dropout', 'BatchNorm', 'EarlyStopping']
train_accuracies = []
val_accuracies = []
test_accuracies = []

for technique in techniques:
    print(f'Running experiment with {technique}')
    
    if technique == 'L1':
        model = create_cnn_model(regularization=regularizers.l1(0.001))
        use_early_stopping = False
    elif technique == 'L2':
        model = create_cnn_model(regularization=regularizers.l2(0.001))
        use_early_stopping = False
    elif technique == 'Dropout':
        model = create_cnn_model(dropout_rate=0.5)
        use_early_stopping = False
    elif technique == 'BatchNorm':
        model = create_cnn_model(batch_norm=True)
        use_early_stopping = False
    elif technique == 'EarlyStopping':
        model = create_cnn_model()
        use_early_stopping = True
    
    optimizer = optimizers.SGD(learning_rate=0.001, momentum=0.9)
    
    train_acc, val_acc, test_acc, training_acc_history = compile_and_train_model(model, optimizer, epochs=15, batch_size=64, use_early_stopping=use_early_stopping)
    
    train_accuracies.append(train_acc)
    val_accuracies.append(val_acc)
    test_accuracies.append(test_acc)
    print(f'{technique} - Train Accuracy: {train_acc:.4f}, Validation Accuracy: {val_acc:.4f}, Test Accuracy: {test_acc:.4f}')

plt.figure(figsize=(10, 6))

plt.plot(techniques, train_accuracies, marker='o', linestyle='-', color='r', label='Training Accuracy')
plt.plot(techniques, val_accuracies, marker='o', linestyle='-', color='b', label='Validation Accuracy')
plt.plot(techniques, test_accuracies, marker='o', linestyle='-', color='g', label='Test Accuracy')

plt.title('Training, Validation, and Test Accuracy vs. Regularization Techniques')
plt.xlabel('Regularization Techniques')
plt.ylabel('Accuracy')
plt.xticks(rotation=45)
plt.legend()
plt.grid(True)
plt.tight_layout()

plt.show()
Running experiment with L1
C:\Users\mmac259\AppData\Roaming\Python\Python310\site-packages\keras\src\layers\convolutional\base_conv.py:107: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(activity_regularizer=activity_regularizer, **kwargs)
L1 - Train Accuracy: 0.3619, Validation Accuracy: 0.3703, Test Accuracy: 0.3768
Running experiment with L2
L2 - Train Accuracy: 0.6869, Validation Accuracy: 0.6781, Test Accuracy: 0.6782
Running experiment with Dropout
Dropout - Train Accuracy: 0.2798, Validation Accuracy: 0.3159, Test Accuracy: 0.3185
Running experiment with BatchNorm
BatchNorm - Train Accuracy: 0.9595, Validation Accuracy: 0.7163, Test Accuracy: 0.7139
Running experiment with EarlyStopping
EarlyStopping - Train Accuracy: 0.7208, Validation Accuracy: 0.6922, Test Accuracy: 0.6897
No description has been provided for this image